轻量级同步机制:Java基础架构中的volatile

发表时间: 2023-11-24 19:06

1、定义:JVM提供的轻量级同步机制,保证了可见性和有序性,不保证原子性


2、内存模型

a、硬件层:CPU主要负责数据运算,内存主要负责数据和指令,CPU处理数据速度远远高于访问内存的速度,为了极大利用CPU的性能,芯片厂商在CPU里设计了多级缓存, 如图下所示:

  1. 带来的问题是当某个CPU更新cache里的某值时,另一个CPU无法获取其最新值,导致缓存不一致。
  2. 硬件层通过缓存一致性协议(如MESI)解决缓存不一致的问题。不同处理器实现了不同的缓存一致性协议
  3. 为了进一步提高性能,CPU增加了store buffer,导致了全局有序性遭到了破坏。
  4. 硬件层为软件人员提供了内存屏障(lfence,sfence 和 mfence)保证全局有序性。

b、JVM层:JVM虚拟机规范中定义了Java内存模型来屏蔽掉各种硬件和操作系统的内存访问差异,以实现让Java程序在各种平台下都能达到一致的内存访问效果。Java内存模型如下:

JVM提供了的内存屏障规范: LL,LS,SS,SL

针对关键字acc_volatile, JVM规定了SSL,LLS,禁止了volatile修饰的变量对应指令和接下来其他指令的重排序。

c、Java语言层: volatile, 字节码层:acc_volatile 。


3、volatile实现的底层原理

通过汇编指令可以看到,Hotspot因为mfence代价太高而没有采用,最终通过lock实现可见性和有序性。

1)、lock确保当缓存修改时会刷新到主内存,同时通知其他线程的缓存失效, 保证了可见性。

2)、lock指令本身即起到了内存屏障的作用,lock后面的指令不允许在lock前缀指令之前执行,从而保证了有序性。