0%

java | Happens-before

happens-before 规定了对共享变量的写操作对其他线程的读操作的可见,它是可见性与有序性的一套规则的总结。

抛开以下 happen-before 规则,JMM 并不能保证一个线程对共享变量的写,对于其他线程对共享变量的读的可见。

锁定规则 (Monitor Lock Rule)

一个 unlock 操作先行发生于后面(时间的先后)对同一个锁的 lock 操作,所以线程解锁 m 之前对变量的写(解锁前会刷新到主内存中),对于接下来对 m 加锁的其它线程对该变量的读可见。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
static int x;
static Object m = new Object();

new Thread(() -> {
synchronized(m){
x = 10;
}
}).start();

new Thread(() -> {
synchronized(m){
System.out.println(x);
}
}).start();

volatile 变量规则 (Volatile Variable Rule)

volatile 变量的写操作先行发生于后面对这个变量的读。

1
2
3
4
5
6
7
8
9
volatile static int x;

new Thread(() -> {
x = 10;
}).start();

new Thread(() -> {
System.out.println(x);
}).start();

线程启动规则 (Thread Start Rule)

Thread 对象的 start() 方法先行发生于此线程中的每一个操作。

1
2
3
4
static int x = 10;//线程 start 前对变量的写,对该线程开始后对该变量的读可见
new Thread(()->{
System.out.println(x);
},"t1").start();

线程终止规则 (Thread Termination Rule)

线程中所有的操作都先行发生于线程的终止检测,可以通过 Thread.join() 方法结束、Thread.isAlive() 的返回值手段检测到线程已经终止执行。

线程中断规则 (Thread Interruption Rule)

对线程 interrupt() 方法的调用先行发生于被中断线程的代码检测到中断事件的发生

传递规则 (Transitivity)

具有传递性,如果操作 A 先行发生于操作 B,而操作 B 又先行发生于操作 C,则可以得出操作 A 先行发生于操作 C

请我喝杯咖啡吧~