美文网首页
JVM-004-内存屏障

JVM-004-内存屏障

作者: Docker_Compose | 来源:发表于2020-11-12 00:34 被阅读0次

    cpu层级保证有序性

     cpu指令乱序执行虽然提升了效率,但是在某种特定的情况,我们并不需要指令乱序执行。为了保障有序性,cpu层级提供了三条汇编的指令,也就是内存屏障。
     这三条汇编指令分别是sfence、lfence、mfence。除此之外,还有lock指令。

    指令 作用
    sfence,即save 写/写。增加该汇编指令后,写操作1必须在写操作2执行前完成。
    lfence,即load 读/读。
    mfence,即modify/mix 读写/读写
    lock 拥有该指令的读写后,任一读写操作都不能被其他cpu修改

    JVM层级保证有序性(x86)

     JVM层级的内存屏障只是一种规范,具体需要根据硬件来实现。
     JVM层级提供了四种内存屏障,LoadLoad屏障、StoreStore屏障、LoadStore屏障、StoreLoad屏障。

    屏障 作用
    LoadLoad屏障 读/读
    StoreStore屏障 写/写
    LoadStore屏障 读/写
    StoreLoad屏障 写/读

    volatile

      volatile在字节码、JVM层面、OS和硬件层面的实现。

    层级 实现
    字节码 增加ACC_VOLATILE 标记
    JVM StoreStoreBarrier volatile 写操作 StoreLoadBarrier ;LoadLoadBarrier volatile 读操作 LoadStoreBarrier
    OS和硬件层面 windows 加 lock

    synchronized

      synchronized在字节码、JVM层面、OS和硬件层面的实现。

    层级 实现
    字节码 monitorenter1+monitorexeit2
    JVM C++调用OS提供的同步机制
    OS和硬件层面 (x86)lock指令 lock cmpxchg xxxx

    相关文章

      网友评论

          本文标题:JVM-004-内存屏障

          本文链接:https://www.haomeiwen.com/subject/sfmmbktx.html