【Java 并发】— volatile 的实现原理
<!-- index-menu -->
volatile不能保证原子性 可以保证 可见性 和 有序性
i = 0; // 原子操作
i = j; // NO
i++; // NO
i = j + 1; // NO
原理
Java 代码: | instance = new Singleton(); // instance 是 volatile 变量 |
汇编代码: | 0x01a3de1d: movb $0x0,0x1104800(%esi);0x01a3de24: **lock** addl $0x0,(%esp); |
有 volatile 变量修饰的共享变量进行写操作的时候会多第二行汇编代码,通过查 IA-32 架构软件开发者手册可知,lock 前缀的指令在多核处理器下会引发了两件事情。
- 将当前处理器缓存行的数据会写回到系统内存。
- 这个写回内存的操作会引起在其他 CPU 里缓存了该内存地址的数据无效
理解
假如有个volatile变量初始化的值是0
线程A获取了该变量并修改成1,这时候修改的其实还是高速缓冲区的值,因为是volatile变量,所以会把1写入内存中,把0改成1,此时,其他线程缓存之前1的值会失效。