JMM Java内存模型

JMM Java内存模型

  • Java的并发采用“共享内存"模型,线程之间通过读写内存的公共状态进行通讯,多个线程之间是不能通过直接传递数据交互的,它们之间的交互只能通过共享变量实现。
  • 主要目的是定义程序中各个变量的访问规则。
  • Java内存模型规定所有变量都存储在主内存中,每个线程还有自己的工作内存。
    • 线程的工作内存中保存了该线程使用到的变量的拷贝(从主内存中拷贝过来),线程对变量的所有操作都必须在工作内存中执行,而不能直接访问主内存中的变量,
    • 不同线程无法直接访问对方工作内存的变量,线程间变量值的传递都要通过主内存来完成
    • 主内存主要对应Java堆中实例数据部分。工作内存对应于虚拟机栈中部分区域。
      JMM Java内存模型_第1张图片
  • Java线程之间的通信由内存模型(Java Memory Model)控制。
    • JMM决定一个线程对变量的写入何时对另一个线程可见。
    • 线程之间共享变量存储在主内存中
    • 每个线程有一个私有的本地内存,里面存储了读、写共享的变量副本
    • JMM通过控制每个线程的本地内存之间的交互,来为程序员提供内存可见性的保证。
  • 可见性、有序性
    • 当一个共享变量在多个本地内存中有副本时,如果一个本地内存修改了这个变量的副本,其他变量应该能看到修改后的值,–可见性
    • 保证线程的有序执行–有序性(保证线程安全)
  • 内存间的交互操作
    • lock(锁定):作用于主内存的变量,把一个变量标识为一个线程独占的状态;
    • unlock(解锁):作用于主内存的变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定
    • read(读取):作用于主内存变量,把主内存的一个变量读取到工作内存中去
    • load(载入): 作用于工作内存,把read操作读取到的工作内存的变量载入到工作内存变量的副本中;
    • use(使用):作用于工作内存的变量,把工作内存中的变量值传递给一个引擎
    • assign(赋值):作用于工作内存的变量,把执行引擎接收到的值赋值给工作内存的变量
    • store(存储):把工作内存的变量的值传递给主内存;
    • write(写入):把store操作的值入道主内存的变量中。
      注意:
    • 不允许read、load、store、write操作之一单独出现
    • 不允许一个线程丢弃assign操作
    • 不允许一个线程不经过assign操作,就把工作内存中的值同步到主内存中
    • 一个新的变量只能在主内存中生成
    • 一个变量同一时刻只允许一条线程对其进行lock操作。但lock操作可以被同一条线程执行多次,只有执行相同次数的unlock操作,变量才会解锁
    • 如果对一个变量进行lock操作,将会清空工作内存中此变量的值,在执行引擎使用这个变量前,需要重新执行load或者assign操作初始化变量的值
    • 如果一个变量没有被锁定,不允许对其进行unlock操作,也不允许unlock一个被其他线程锁定的变量
    • 对一个变量执行unlock之前,需要将该变量同步回主内存中。

你可能感兴趣的:(JVM基础,java)