Java并发机制底层实现原理-volatile
2018-04-29 本文已影响12人
markfork
章节目录
- volatile的实现原理与应用
1.volatile的实现原理与应用
Java source code->Java class->JVM->汇编指令->cpu执行
java中使用的并发机制依赖于JVM实现和cpu指令。
1.1 volatile应用
volatile-保证可见性
volatile 是轻量级 synchronized,在多处理器并发中保证了共享变量的"可见性"。
可见性含义:
当一个线程修改共享变量时,另一个线程能立即读到这个修改的值。
volatile-执行成本低
volatile不会引起线程上下文的切换和调度。
使用合适,volatile的使用代价会比synchronized小。
volatile 如何保证可见性
class A{
private volatile Singleton instance ;
public A(){
instance = new Singleton();
}
}
转成汇编代码,如下:
movb, lock add1
上述对volatile共享变量instance进行写操作的时候会多出第二行汇编代码,Lock前缀的指令在多核处理器下会引发两件事情。
- 将当前处理器缓存行的数据写回到系统内存(工作内存写入到主内存)
- 这个写回操作,会使在其他cpu里缓存了该内存地址的数据无效。
注意:在多处理器下,为了保证各个处理器缓存是一致的,就会实现缓存一致性协议
缓存一致性协议
每个处理器通过嗅探在总线上传播的数据来对比检查自己缓存的值是否过期
了,当处理器发现自己缓存行对应的内存地址中的值被修改,就会将当前处理
器的缓存行设置为无效状态,当其他处理器对这个共享变量进行修改操作时,
会重新从系统内存中把数据都到处理器缓存行当中。
volatile两条实现原则
- Lock前缀指令会引起处理器缓存回写到内存
1.锁总线+独占任何共享内存
2.缓存锁定+缓存一致性协议
- 一个处理器的缓存回写到主内存会导致其他缓存此主内存共享变量的处理器缓存无效
每个处理器通过嗅探在总线上传播的数据来对比检查自己缓存的值是否过期
了,当处理器发现自己缓存行对应的内存地址中的值被修改,就会将当前处理
器的缓存行设置为无效状态,当其他处理器对这个共享变量进行修改操作时,
会重新从系统内存中把数据都到处理器缓存行当中。