Volatile底层实现
volatile
硬件屏障
各个硬件的内存屏障不同
内存屏障
LoadLoad屏障
对于这样的语句 Load1;LoadLoad;Load2;
在Load2及后续读取操作要读取得数据被访问前,保证Load1要读取的数据被读取完毕。StoreStore屏障
对于这样的语句 Store1;StoreStore;Store2;
在Store2及后续写入操作执行前,保证Store1的写入操作对其它处理器可见。LoadStore屏障
对于这样的语句 Load1;LoadStore;Store2;
在Store2及后续写入操作被刷出前,保证Load1要读取的数据被读取完毕。StoreLoad屏障
对于这样的语句 Store1;StoreLoad;Load2;
在Load2及后续所有读取操作执行前,保证Store1的写入对所有的处理器可见
volatile的实现细节
字节码层面
ACC_VOLATILE 加了这样一个标识
JVM层面 –读取到字节码上的ACC_VOLATILE标识加下面的内存屏障
StoreStoreBarrier
volatile写操作
StoreStoreBarrier
LoadLoadBarrier
volatile读操作
LoadLoadBarrier
OS和硬件层面
需要用hsdis查看
windows 就是lock指令实现
synchronized的实现
字节码层面
ACC_SYNCHRONIZED 标识
monitorenter 实现
monitorexit 实现JVM层面
C 和C++调用操作系统提供的同步机制
OS和硬件层面
lock指令