JMMjava内存模型

JMM : java memory modul : java内存模型

简单的来说,jmm是一种协议,一种规范。它是一种缓存一致性协议,规定了数据读写的规则。

JMM定义了线程工作内存和主内存之间的抽线关系,JMM规定了8个操作来完成主内存和工作内存的交互

  • use:把工作内存的值传给执行引擎
  • assign:从执行引擎中得到的值传递给工作内存的变量中
  • lock:把变量表示为线程独占内存
  • unlock:解除独占内存标记
  • read    (读取):作用于主内存变量,它把一个变量的值从主内存传输到线程的工作内存中,以便随后的load动作使用
  • load     (载入):作用于工作内存的变量,它把read操作从主存中变量放入工作内存中
  • assign  (赋值):作用于工作内存中的变量,它把一个从执行引擎中接受到的值放入工作内存的变量副本中
  • store    (存储):作用于主内存中的变量,它把一个从工作内存中一个变量的值传送到主内存中,以便后续的write使用
  • write  (写入):作用于主内存中的变量,它把store操作从工作内存中得到的变量的值放入主内存的变量中

JMMjava内存模型_第1张图片

 为了解决共享可见性这个问题,java引入了volatile关键字

volatile: 具有可见性、有序性,不具备原子性。

JMM协议堆八种指令的使用,制定了如下规定:

  • 程序次序规则(Program Order Rule):在一个线程内,程序的执行规则跟程序的书写规则是一致的,从上往下执行。
  • 管程锁定规则(Monitor Lock Rule):一个Unlock的操作肯定先于下一次Lock的操作。这里必须是同一个锁。同理我们可以认为在synchronized同步同一个锁的时候,锁内先行执行的代码,对后续同步该锁的线程来说是完全可见的。
  • volatile变量规则(volatile Variable Rule):对同一个volatile的变量,先行发生的写操作,肯定早于后续发生的读操作
  • 线程启动规则(Thread Start Rule):Thread对象的start()方法先行发生于此线程的没一个动作
  • 线程中止规则(Thread Termination Rule):Thread对象的中止检测(如:Thread.join(),Thread.isAlive()等)操作,必行晚于线程中所有操作
  • 线程中断规则(Thread Interruption Rule):对线程的interruption()调用,先于被调用的线程检测中断事件(Thread.interrupted())的发生
  • 对象中止规则(Finalizer Rule):一个对象的初始化方法先于一个方法执行Finalizer()方法
  • 传递性(Transitivity):如果操作A先于操作B、操作B先于操作C,则操作A先于操作C

 

你可能感兴趣的:(java)