在前面的文章中(从 CPU 说起,深入理解 Java 内存模型!),我们深入了解了 Java 内存模型,知道了 Java 内存模型诞生的意义,以及其要解决的问题。最终我们知道:Java 内存模型就是定义了 8 个基本操作以及 8 个规则,只要遵守这些规则的并发操作,那么它们就是安全的。
即使强如树哥的人,看了这 16 条规则也很头疼。它们太过于繁琐了,非常不利于我们日常代码的编写。为了能帮助编程人员理解,于是就有了与其相等价的判断原则 —— 先行发生原则,它可以用于判断一个访问在并发环境下是否安全。
到这里,我们需要明白:happens-before 原则是对 Java 内存模型的简化,让我们更好地写出并发代码。就像 Java 语言等高级语言,之于汇编语言、机器语言等低级语言一样,可以让编程人员免受「皮肉之苦」。
今天就让我们来深入聊聊关于 happens-before 的那些事儿!
什么是 happens-before?
happens-before 指的是 Java 内存模型中两项操作的顺序关系。例如说操作 A 先于操作 B,也就是说操作 A 发生在操作 B 之前,操作 A 产生的影响能够被操作 B 观察到。这里的「影响」包括:内存中共享变量的值、发送了消息、调用了方法等。
举个很简单的例子:下面代码里 i=1
在线程 A 中执行,而 j=i
在线程 B 中执行。因为 i=1
操作先于 j=i
执行,那么 i&