详解JMM

JMM是Java内存模型,与JVM内存模型是两回事,JMM的主要目标是定义程序中变量的访问规则,如下图,所有的共享变量都存储在主内存中共享,每个线程拥有自己的工作内存(相当于高速缓存,有利于提高访问速度),工作内存中保存的是主内存中变量的副本,线程对变量的读写操作是在自己的工作内存中进行,而不是直接读写主内存中的变量。如此多线程进行数据操作时,将可能发生线程安全问题,因此JMM需要提供原子性、可见性、有序性的保证。


image.png

详解JMM保证

image.png

原子性

JMM保证除long 和double 外的基本数据类型的读写操作是原子性的,另外synchronized也可以提供原子性保证。sychronized的原子性是通过Java的两个字节码指令 monitorenter 和 monitorexit 来保证的。

可见性

volatile强制变量的赋值会同步刷新回主内存中,强制变量的读取从主内存中加载,保证不同线程始终能看到该变量的最新值。这就保证了可见性。

有序性

对有序性的保证,主要通过volatie和一系列happers-before原则。volatie的另一个作用就是阻止指令重排序,这样就可以保证变量读写的有序性。

happens-before原则包括一系列规则,如:

  • 程序顺序有原则,即一个线程内必须保证语义串行性。
  • 锁规则,即对同一个锁的解锁一定发生在再次加锁之前。

你可能感兴趣的:(详解JMM)