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