happens-before 规定了对共享变量的写操作对其他线程的读操作的可见,它是可见性与有序性的一套规则的总结。
抛开以下 happen-before 规则,JMM 并不能保证一个线程对共享变量的写,对于其他线程对共享变量的读的可见。
锁定规则 (Monitor Lock Rule)
一个 unlock 操作先行发生于后面(时间的先后)对同一个锁的 lock 操作,所以线程解锁 m 之前对变量的写(解锁前会刷新到主内存中),对于接下来对 m 加锁的其它线程对该变量的读可见。
1 | static int x; |
volatile 变量规则 (Volatile Variable Rule)
对 volatile 变量的写操作先行发生于后面对这个变量的读。
1 | volatile static int x; |
线程启动规则 (Thread Start Rule)
Thread 对象的 start() 方法先行发生于此线程中的每一个操作。
1 | static int x = 10;//线程 start 前对变量的写,对该线程开始后对该变量的读可见 |
线程终止规则 (Thread Termination Rule)
线程中所有的操作都先行发生于线程的终止检测,可以通过 Thread.join() 方法结束、Thread.isAlive() 的返回值手段检测到线程已经终止执行。
线程中断规则 (Thread Interruption Rule)
对线程 interrupt() 方法的调用先行发生于被中断线程的代码检测到中断事件的发生
传递规则 (Transitivity)
具有传递性,如果操作 A 先行发生于操作 B,而操作 B 又先行发生于操作 C,则可以得出操作 A 先行发生于操作 C