volatile 原理
2018-03-22 09:41
225 查看
定义:Java 允许线程访问共享变量,为了确保共享变量能被准确和一致地更新,线程应该确保通过排他锁单独获得这个变量。
volatile 如何确保共享变量的可见性?
有 volatile 修饰的共享变量进行写操作时,它的汇编指令中会有 lock 字样,称为 Lock 前缀。Lock 前缀的指令在多核处理器下会引发两件事情:
1)将当前处理器缓存行的数据写回到系统内存
2)这个写回内存的操作会使其他 CPU 里缓存了该内存地址的数据无效
解释:如果对声明了 volatile 的变量进行写操作时,JVM 会向处理器发送一条 Lock 前缀的指令,将这个变量所在缓存行的数据写回到系统内存。但是,其他处理器的缓存行内的数据仍然是旧数据。因此为了保证各个处理器的缓存是一致的,就要采用缓存一致性协议,即每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是不是过期了,当处理器发现自己缓存行对应的内存地址被修改了,就会将当前处理器的缓存行设置成无效状态,当处理器对这个数据进行修改操作时,会重新从系统内存中读取数据到缓存行中。
volatile 如何确保共享变量的可见性?
有 volatile 修饰的共享变量进行写操作时,它的汇编指令中会有 lock 字样,称为 Lock 前缀。Lock 前缀的指令在多核处理器下会引发两件事情:
1)将当前处理器缓存行的数据写回到系统内存
2)这个写回内存的操作会使其他 CPU 里缓存了该内存地址的数据无效
0x01a3de1d: movb $0×0,0×1104800(%esi);0x01a3de24: lock addl $0×0,(%esp);
解释:如果对声明了 volatile 的变量进行写操作时,JVM 会向处理器发送一条 Lock 前缀的指令,将这个变量所在缓存行的数据写回到系统内存。但是,其他处理器的缓存行内的数据仍然是旧数据。因此为了保证各个处理器的缓存是一致的,就要采用缓存一致性协议,即每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是不是过期了,当处理器发现自己缓存行对应的内存地址被修改了,就会将当前处理器的缓存行设置成无效状态,当处理器对这个数据进行修改操作时,会重新从系统内存中读取数据到缓存行中。
相关文章推荐
- Java Volatile 原理,使用
- 并发编程-volatile原理和应用
- Java中volatile关键字实现原理
- 深入分析Volatile的实现原理
- 聊聊并发(一)深入分析Volatile的实现原理
- 【并发】Volatile和synchronized的实现原理
- 聊聊并发(1):深入分析Volatile的实现原理
- 【多核线程-volatile原理与技巧】
- 聊聊并发(一)深入分析Volatile的实现原理
- 深入分析Volatile的实现原理
- volatile原理与技巧
- java多线程编程底层原理剖析以及volatile原理
- Java volatile 原理解析
- 就是要你懂 Java 中 volatile 关键字实现原理
- 深入分析Volatile的实现原理
- 聊聊并发(一)——深入分析Volatile的实现原理
- volatile原理与技巧
- 聊聊并发(一)深入分析Volatile的实现原理
- Java 并发编程:volatile的使用及其原理
- 深入分析Volatile的实现原理