知识卡片
HB是推理工具
内容
Happens-Before 不是”谁先谁后”的时间线,而是 JMM 定义的可见性推理规则集合:程序顺序规则、[[volatile传递信号]] 的写读规则、监视锁解锁先于后续加锁、线程 start()/join() 规则——这些规则可按传递性组合链接(A先于B、B先于C,则A先于C)。它的价值是让开发者不必深入硬件细节,就能判断”线程A的写入是否必然对线程B可见”,是推理工具而非时间表。
参考来源
- 位置:《Java高并发核心编程.卷2,多线程、锁、JMM、JUC、高并发设计模式》第4章《可见性与有序性的原理》4.6.1节《Happens-Before规则介绍》、4.6.4节《规则3:传递性规则》(源文件:_epub-src/OEBPS/Text/chapter143.xhtml、chapter146.xhtml)
- 结论依据:原文列出程序顺序、volatile变量、传递性、监视锁、start、join六条Happens-Before规则的具体定义,并用VolatileReorderDemo2示例演示如何用规则1(程序顺序)+规则2(volatile)通过规则3(传递性)推出“value=100先行发生于读变量if(flag)”,因此可以推出Happens-Before是推理工具而非时间先后表的结论。
- 原始内容:如果A操作先于B操作,而B操作又先行发生于C操作,那么A操作先行发生于C操作……value=100先行发生于flag=true,这是规则1……写变量flag=true先行发生于if(flag)读变量,这是规则2,所以,根据规则3(传递性规则),value=100先行发生于读变量if(flag)。