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 |









网友评论