天天看点

happens-before规则1. 定义2. 程序顺序规则3. 监视器锁规则4. volatile变量规则5. 传递性6. start()7. join规则

1. 定义

JSR-133使用happens-before的概念来指定两个操作之间的执行顺序,由于这两个操作可能是一个线程内,也有可能是两个线程内的,所以JMM可以通过happens-before来项程序员提供跨线程的可见性保证(如果A线程的a操作和B线程的b操作之间有happens-before关系,那么JMM保证a操作对b操作可见)。

其实并不会保证执行顺序,也是保证了最终结果是一致的就行。

as-if-serial:保证单线程内程序的执行结果不会被改变。创造出一个幻境:单线程程序是按照程序的顺序来执行的。

happens-before:保证正确同步的多线程程序的执行结果不被改变。创造出一个幻境:正确同步的多线程程序是按照happens-before指定的顺序执行的。

2. 程序顺序规则

一个线程中的每个操作,happens-before于该线程的任意后续操作。

也就是说,单个线程内部每个操作都对后续操作可见

类似于as-if-serial

3. 监视器锁规则

对一个锁的解锁,happens-before于随后对这个锁的加锁

也就是针对于解锁操作,对后续的加锁操作可见。

根据传递性,也就是说解锁前的操作也对加锁操作可见,一个线程在持有锁期间的操作对后续另一个线程持有这把锁的期间的操作可见

happens-before规则1. 定义2. 程序顺序规则3. 监视器锁规则4. volatile变量规则5. 传递性6. start()7. join规则

根据第(1)条规则,1 happens-before 2 且3 happens-before 4,当前规则是 2 happens-before 3,由传递性可知,1 happens 4,所以在1处修改的共享变量会在4处可见,更深一点就是A线程中解锁前的操作对B线程加锁后的操作可见。

4. volatile变量规则

对一个volatile域的写操作,happens-before与后续任意对这个volatile域的读操作

也就是对于volatile域来说,一直可以读取到最新的值

happens-before规则1. 定义2. 程序顺序规则3. 监视器锁规则4. volatile变量规则5. 传递性6. start()7. join规则

同上:1 happens-before 2,3happens-before 4,当前2 happens-before 3,所以 1 happens-before 4,那么1处的修改对4处可见。

5. 传递性

A happens-before B,且B happens-before C,那么A happens-before C

6. start()

如果线程A执行了线程B.start(),那么线程A的start()操作happens-before于线程B的任意操作

也就是线程A的操作对线程B可见

happens-before规则1. 定义2. 程序顺序规则3. 监视器锁规则4. volatile变量规则5. 传递性6. start()7. join规则

可知,1 happens before 2,当前 2 happens-before 4,所以1 happens-before 4,也就是A线程在执行B线程.start()之前的操作,对B线程执行过程中都可见。

7. join规则

如果线程A执行线程B.join()并成功返回,那么线程B中的任意操作happens-before与线程A从线程B.join()操作成功返回

happens-before规则1. 定义2. 程序顺序规则3. 监视器锁规则4. volatile变量规则5. 传递性6. start()7. join规则

可知:2 happens-before 3,4 happens-before 5,当前2 happens-before 4,可知,2 happens-before 5,所以当在A线程执行B线程.join()并成功返回之后,B线程的任何操作对A线程的后续操作可见。