volatile

硬件屏障

各个硬件的内存屏障不同

内存屏障

  1. LoadLoad屏障

    对于这样的语句 Load1;LoadLoad;Load2;
    在Load2及后续读取操作要读取得数据被访问前,保证Load1要读取的数据被读取完毕。

  2. StoreStore屏障

    对于这样的语句 Store1;StoreStore;Store2;
    在Store2及后续写入操作执行前,保证Store1的写入操作对其它处理器可见。

  3. LoadStore屏障

    对于这样的语句 Load1;LoadStore;Store2;
    在Store2及后续写入操作被刷出前,保证Load1要读取的数据被读取完毕。

  4. StoreLoad屏障

    对于这样的语句 Store1;StoreLoad;Load2;
    在Load2及后续所有读取操作执行前,保证Store1的写入对所有的处理器可见

volatile的实现细节

  1. 字节码层面

    ACC_VOLATILE 加了这样一个标识

  2. JVM层面 –读取到字节码上的ACC_VOLATILE标识加下面的内存屏障

StoreStoreBarrier
volatile写操作
StoreStoreBarrier


LoadLoadBarrier
volatile读操作
LoadLoadBarrier

  1. OS和硬件层面

    需要用hsdis查看
    windows 就是lock指令实现

synchronized的实现

  1. 字节码层面

    ACC_SYNCHRONIZED 标识
    monitorenter 实现
    monitorexit 实现

  2. JVM层面

    C 和C++调用操作系统提供的同步机制

  3. OS和硬件层面

    lock指令