内存可见性
内存可见性:线程对共享变量修改的可见性。当一个线程修改了共享变量的值,其他线程能够立刻得知这个修改。
volatile 可以保证线程可见性且提供了一定的有序性,但是无法保证原子性。在 JVM 底层 volatile 是采用 “内存屏障” 来实现的。
观察加入 volatile 关键字和没有加入 volatile 关键字时所生成的汇编代码发现,加入 volatile 关键字时,会多出一个 lock 前缀指令,lock 前缀指令实际上相当于一个内存屏障,内存屏障提供以下3个功能:
- 确保指令重排序时不会把其后面的指令排序到内存屏障之前的位置,也不会把前面的指令排序到内存屏障的后面;即在执行到内存屏障这句指令时,在他前面的操作已经全部完成;
- 它会强制将对缓存的修改操作立即回写到主存中
- 如果是写操作,他会导致其他CPU 中对应的缓存行无效。