JVM-004-内存屏障
2020-11-12 本文已影响0人
Docker_Compose
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 |