volatile 关键字
volatile —— 轻量级 synchronized ,在并发编程中保证共享变量等“可见性”。
可见性:当一个线程修改一个共享变量时,其他线程能够读到这个修改的值。
volatile 不会引起线程上下文的切换和调度。
1.1 volatile 的实现原则
1)Lock 前缀指令(编译后生成)会引起处理器缓存回写到内存。
总线锁定和缓存锁定。
总线锁定:Lock前缀指令导致在指令执行期间声言处理器的 Lock# 信号,锁住总线,导致其他CPU不能访问总线。
缓存锁定:若访问的内存区域已经缓存在处理器内部,则不会声言 Lock# 信号,会锁定这块内存区域的缓存并写会到内存,并使用缓存一致性机制确保修改的原子性。
2)一个处理器的缓存回写到内存会导致其他处理器到缓存无效。
处理器使用嗅探技术保证它的内部缓存、系统内存和其他处理器的缓存的数据在总线上保持一致。
1.2 volatile 的使用优化
LinkedTransferQueue通过追加字节将共享变量追加到64字节,与处理器的位数保持一致。避免头结点和尾结点加载到同一个缓存行,使头、尾结点在修改时不会相互锁定。
使用 volatile 变量是否都应追加字节?
不是,以下两种场景不应该使用该方式:
1)缓存行非64字节宽到处理器
2)共享变量不会被频繁地写
Synchronized 的实现原理及应用
synchronized —— 重量级锁,实现同步的基础:Java 中每个对象都可以作为锁。
3种形式及锁对象:
非静态方法:锁为当前实例对象
静态方法:锁为当前类的Class对象
同步方法块:锁为括号里配置的对象
JVM 规范中可以看到 synchronized 实现原理,但两者但实现细节不同。
网友评论