Happens-Before 规则

Happens-Before 规则约束了编译器的优化行为,规定某个线程修改的变量何时对其他线程可见。将 Happens-Before 翻译为中文,大致为“前面一个操作的结果对后续操作是可见的”。

1 程序的顺序性原则

在一个线程中,按照顺序,前面的操作 Happens-Before 于后续的任意操作。

2 volatile 变量规则

对一个 volatile 变量的写操作,Happens-Before 于后续对这个 volatile 变量的读操作。

3 传递性

如果 A Happens-Before B,且 B Happens-Before C,那么 A Happens-Before C。

4 管程中锁的规则

对一个锁的解锁 Happens-Before 于后续对这个锁的加锁。 管程是一种通用的同步原语,在 Java 中, synchronized 是对管程的实现。

5 线程 start() 规则

主线程 A 启动子线程 B 后,子线程 B 能够看到主线程在启动子线程 B 前的操作。

6 线程 join() 规则

主线程 A 等待子线程 B 完成(主线程 A 通过调用子线程 B 的thread.join方法实现),当子线程 B 完成后(主线程 A 中 join() 方法返回),主线程能够看到子线程对于共享变量的操作。