zoukankan      html  css  js  c++  java
  • Java内存模型

    线程与JVM

    1基本概念:

    程序:代码,完成某一件任务,代码序列(静态的概念)

    进程:程序在某些数据上的一次运行(动态的概念)

    线程:一个进程可能包含一个或多个线程(占有资源的独立单元)

    2 JVM与线程

    JVM什么时候启动?类被调用    JVM线程---》其他的线程(main)

    线程在JVM中

    3 JVM内存区域

    Java 内存区域和内存模型是不一样的东西,内存区域是指 Jvm 运行时将数据分区域存储,强调对内存空间的划分。

    而内存模型(Java Memory Model,简称 JMM )是定义了线程和主内存之间的抽象关系,即 JMM 定义了 JVM 在计算机内存(RAM)中的工作方式,

    如果我们要想深入了解Java并发编程,就要先理解好Java内存模型。

    众所周知,Java 虚拟机有自动内存管理机制,如果出现内存泄漏和溢出方面的问题,排查错误就必须要了解虚拟机是怎样使用内存的。

    下图是 JDK8 之后的 JVM 内存布局。

     JDK8 之前的内存区域图如下:

    方法区:类信息classloader、常量、static静态变量 、JIT    (信息共享)

    Java堆区:实例对象(new出来的)     GC   (信息共享)   (OOM)

    虚拟机栈vm stack:Java方法在运行的内存模型   (线程私有) (OOM),每一个方法都有一个栈针:存放局部变量,引用类型的地址,操作数栈等等

    PC程序计数器:java线程的私有数据,这个数据就是执行下一条指令的地址

      虚拟机的本地方法栈Native method stack:  与JVM的native方法有关 

    4 Java内存模型   Java memory model   JMM(规范,抽象的模型) 

    1)主内存:共享的信息

    2)工作内存:私有信息,基本数据类型,直接分配到工作内存,引用的地址存放在工作内存,引用的对象存放在堆中

    3)工作方式:

             A  线程修改私有数据,直接在工作空间修改

             B  线程修改共享数据,把数据复制到工作空间中去,在工作空间中修改,修改完成以后,刷新内存中的数据 

    5硬件内存架构与java内存模型

    1)       硬件架构

    a)       CPU缓存的一致性问题:并发处理的不同步

    b)       解决方案:

    1. 总线加锁()  降低CPU的吞吐量
    2. 缓存上的一致性协议(MESI)

    当CPU在CACHE中操作数据时,如果该数据是共享变量,数据在CACHE读到寄存器中,进行新修改,并更新内存数据

    CaCHE  LINE置无效,其他的CPU就从内存中读数据

    2)       Java线程与硬件处理器

    3)       Java内存模型与硬件内存架构的关系

    Java内存模型与硬件内存架构交叉:数据的不一致问题

    4)       Java内存模型的必要性

         Java内存模型的作用:规范内存数据和工作空间数据的交互

    6、并发编程的三个重要特性

    原子性:不可分割的操作,要么同时发生,要么同时不发生  如:x=1

    可见性:线程只能操作自己工作空间中的数据

    有序性:程序中的顺序不一定就是执行的顺序,可能会发生重排序,如图

          编译期:编译重排序

         指令期:指令重排序

           目的是提高效率

    as-if-serial语义

    as-if-serial语义的意思是:不管怎么重排序(编译器和处理器为了提高并行度),(单线程)程序的执行结果不会改变。

    编译器、runtime和处理器都必须遵守as-if-serial语义。

    为了遵守as-if-serial语义,编译器和处理器不会对存在数据依赖关系的操作做重排序,因为这种重排序会改变执行结果。

    但是,如果操作之间不存在数据依赖关系,这些操作就可能被编译器和处理器重排序。

    happens-before规则

    Happens-before原则:

    1)程序次序原则:一个线程中的每个操作,happens-before于该线程中任意的后续操作

    2)锁定原则  :后一次加锁必须等前一次解锁

    3)Volatile原则:霸道原则,禁止Volatile修饰的变量重排序

    4)传递原则:如果A happens-before B,且Bhappens-before C,那么Ahappens-before C。 A---B ---C    A--C

    7、JMM对三个特征的保证

    1)JMM与原子性

      A) X=10  写  原子性   如果是私有数据具有原子性,如果是共享数据没原子性(读写) 

      B) Y=x  没有原子性

        a)        把数据X读到工作空间(原子性)

        b)        把X的值写到Y(原子性)

      C) I++ 没有原子性

        a)       读i到工作空间

        b)       +1;

        c)        刷新结果到内存

      D) Z=z+1 没有原子性

        a)       读z到工作空间

        b)       +1;

        c)       刷新结果到内存

    结论:多个原子性的操作合并到一起,反而没有原子性.如需保证原子性,可用以下方式:

      Synchronized

      JUC   Lock的lock

    2)JMM与可见性

         Volatile:在JMM模型上实现MESI协议

         Synchronized:加锁

      JUC   JUC   Lock的lock

    3)JMM与有序性

      Volatile:

      Synchronized:

  • 相关阅读:
    Spring Boot简明教程之实现Web开发及常用参数获取方式分析
    SpringBoot 简明教程之项目属性配置(三):配置文件优先级及多配置切换
    史上最简单MySQL教程详解(进阶篇)之存储过程(二)
    史上最简单MySQL教程详解(进阶篇)之存储过程(一)
    文字从中间向两边延展
    字符串转化成驼峰命名
    统计字符串字符个数
    while求和(1到100)
    for循环实现乘阶
    递归遍历所有ul下的所有子节点
  • 原文地址:https://www.cnblogs.com/lusaisai/p/12791036.html
Copyright © 2011-2022 走看看