在并发编程中Happens-Before 规则是相当重要的规则,它所代表的意思是前面一个操作对后续操作是可见的,共有6项规则如下:
- 程序的顺序性规则
- volatile 变量规则
- 传递性
- 管程中锁的规则
- 线程 start() 规则
- 线程 join() 规则
分别对以上6种规则进行解释:
1.程序的顺序性规则
程序的顺序性指的是代码会按照书写的顺序去执行,也就是单线程方式。
2.volatile 变量规则
对一个 volatile 变量的写操作, Happens-Before 于后续对这个 volatile的读操作。
理解:如果两个线程对共有变量进行操作,前一个线程对变量的写操作,对后续另一个变量的读操作是可见的。
3.传递性
如果 A Happens-Before B,且 B Happens-Before C,那么 A Happens-Before C。
这需要举个例子,传递性结合1和2进行说明,首先一个线程有2个变量,其中第一句话是赋值语句,然后两个线程通过volatile关联起来,然后另一个线程能读到第一个线程中的变量。
4 管程中锁的规则
对一个锁的解锁 Happens-Before 后续对这个锁的加锁.
管程是什么意思?
synchronized,synchronized 是管程的实现,编译器实现了同步代码块的加锁和解锁操作。
5 .线程 start() 规则
主线程 A 启动子线程 B 后,子线程 B 能够看到主线程在启动子线程 B 前的操作。
6.线程 join() 规则
关于线程等待的。它是指主线程 A 等待子线程 B 完成(主线程 A 通过调用子线程 B 的 join() 方法实现),当子线程 B 完成后(主线程 A 中 join() 方法),主线程能够看到 子线程的操作。