前言
Java 代码在编译后会变成 Java 字节码,字节码被类加载器加载到 JVM 里,JVM 执行字节码,最终需要转化为汇编指令在 CPU 上执行,Java 中所使用的并发机制依赖于 JVM 的实现和 CPU 的指令。
volatile 的定义与实现原理
Java 编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。
Java 语言提供了 valotile,在某些情况下比锁更加方便。
如果一个字段被声明成 volatile,Java 线程内存模型确保所有线程看到这个变量的值是一致的。
volatile 是如何保证可见性呢?通过查看汇编代码来看看 volatile 进行写操作时,CPU 会做什么事情:
instance = new Singleton(); //instance 是 volatile 变量
对应的汇编指令会添加一个 lock 指令,通过查 IA-32 架构软件开发手册可知, Lock 前缀的指令在多核处理器下会引发两件事情。
- 将当前处理器缓存航的数据写回到系统内存;
- 这个写回内存的操作会使其它 CPU 里缓存了该内存地址的数据无效。