【Java 并发】— volatile 的实现原理

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的值会失效。

参见 聊聊并发(一)——深入分析Volatile的实现原理

Last modification:December 2nd, 2019 at 07:22 pm