如何保证代码特定情况下不乱序
硬件保证
内存屏障
x86中:
①sfence:也就是save fence,写屏障指令。在sfence指令前的写操作必须在sfence指令后的写操作前完成。
②lfence:也就是load fence,读屏障指令。在lfence指令前的读操作必须在lfence指令后的读操作前完成。
③mfence:在mfence指令前得读写操作必须在mfence指令后的读写操作前完成。
原子指令
lock指令等
jvm级别规范(JSR133)
- loadload 屏障: load-loadload-load
- storestore屏障 :store-storestore-store
- loadstore 屏障: load- loadstore-store
- storeload屏障 : store- storeload-load
java代码中volatile保证有序性
public class CatTest {
int test;
volatile int count;
}
字节码层次:
jvm层次
volatile内存区读写都加读写
loadload
volatile 读
loadstore
storestore
volatile 写
storeload
硬件层次
windows lock指令实现
不同的操作系统实现细节不同
java代码中synchronized保证有序
public class CatTest {
public CatTest(){
synchronized (this){
}
}
}
字节码层次:
jvm层次:
c c++调用了操作系统提供的同步机制
操作系统层次:
x86: lock cmpxchg xx