六条Happens-before原则

355 阅读1分钟

Happens-before规则

前面一个操作的结果对后续的操作是可见的。

约束了编译器的优化行为,虽允许优化,但是要求编译器优化后的原则一定遵守Happens-before规则。

六项规则:

  • 程序有序性
  • volatile读写操作顺序
  • 传递性
  • 加解锁顺序
  • 线程启动
  • 线程等待

1.程序的顺序性原则

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

2.volatile操作

定义volatile读写顺序。对一个volatile变量的写操作,Happens-before于后续对这个volatile变量的读操作。

3.传递性

传递性。如果A happens-before B,且B happends-before C,那么A happens-before C。

4.管程中锁的规则

关于加解锁顺序。一个锁的解锁Happens-before于后续对这个锁的加锁。

5.线程start()规则

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

6.线程join规则

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