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()返回),主线程能够看到子线程的操作。 看到指的是,对共享变量的操作。