happens-before是JMM
最核心的概念
happens-before字面翻译过来就是先行发生,A happens-before B 就是A先行发生于B?
不准确!在Java内存模型中,happens-before 应该翻译成:前一个操作的结果可以被后续的操作获取。讲白点就是前面一个操作把变量a赋值为1,那后面一个操作肯定能知道a已经变成了1。
happens-before规则
1
)
程序顺序规则
:一个线程中,按照程序的顺序,前面的操作happens-before后续的任何操作,一
个线程中的每个操作,
happens- before于该线
程中的任意后
续
操作。
2)
管程中的锁规则 / 监视器锁规则
:
对一个锁
的解
锁
,
happens-before于随后
对这
个
锁
的加
锁
。
3
)
volatile变量规则
:
对一个volatile
域的写,
happen-before于任意后续对这
个
volatile
域的 读。
4
)
传递性
:如果
A happens-before B,且B happens-before C,那么A happens-before C。
5
)
start()规则
:如果
线
程
A
执
行操作
ThreadB.start()
(启
动线
程
B
),那么
A
线
程的 ThreadB.start()操作
happens-before于
线
程
B
中 的 任意操作。
6
)
join()规则
:如果
线
程
A
执
行操作
ThreadB.join()并成功返回,那么
线
程
B
中的任意操作 happens-before于线程
A
从
ThreadB.join() 操作成功返回。