知识卡片

volatile传递信号

普通读书笔记卡 · 1519

内容

volatile 更适合表达状态标志和发布信号,正确语义是 JMM 的 Happens-Before 规则:对 volatile 变量的写先行发生于后续对它的读(此前普通变量的写也因传递性一并可见)。这不是”刷新到内存”的硬件比喻,而是 JMM 承诺的可见性/有序性保证。volatile 不保护”读取-计算-写回”的原子性,不能单独解决自增问题。

参考来源

- 位置:《Java高并发核心编程.卷2,多线程、锁、JMM、JUC、高并发设计模式》第4章《可见性与有序性的原理》4.6.1节《Happens-Before规则介绍》、4.6.3节《规则2:volatile规则》、4.5.5节《volatile语义中的内存屏障》(源文件:_epub-src/OEBPS/Text/chapter143.xhtml、chapter145.xhtml、chapter141.xhtml) - 结论依据:原文将 Happens-Before 规则中的“volatile变量规则”定义为“对volatile(修饰的)变量的写操作必须先行发生于对volatile变量的读操作”,并结合传递性规则说明写在volatile写之前的普通变量也会对读线程可见;同时给出JVM为volatile读写插入LoadLoad/StoreStore/StoreLoad等内存屏障的具体策略,因此推出应以Happens-Before语义而非硬件搬运比喻描述volatile。 - 原始内容:对一个volatile变量的写先行发生(Happens-Before)于任意后续对这个volatile变量的读……value=100先行发生于flag=true,这是规则1,写变量flag=true先行发生于if(flag)读变量,这是规则2,所以,根据规则3(传递性规则),value=100先行发生于读变量if(flag)。