k后面指令时,会设置处理器的LOCK#信号(这个信号会锁定总线,阻止其它CPU通过总线访问内存,直到这些指令执行结束),这条指令的执行变成原子操作,之前的读写请求都不能越过lock指令进行重排,相当于一个内存屏障。
还有一个:第二次使用foo变量时,从内存中重新加载,保证可以拿到foo变量的最新值,这是由如下指令实现
__asm__ volatile ( : : : "cc", "memory");
同样是编译器屏障,通知编译器重新生成加载指令(不可以从缓存寄存器中取)。
读取volatile变量
同样在bytecodeInterpreter.cpp
文件中,找到getstatic字节码指令的解释器实现。
通过obj->obj_field_acquire(field_offset)
获取变量值
最终通过OrderAccess::load_acquire
实现
inline jint OrderAccess::load_acquire(volatile jint* p) { return *p; }
底层基于C++的volatile实现,因为volatile自带了编译器屏障的功能,总能拿到内存中的最新值。