在Jdk1.5以后,提供了happens-Before规则,为了约束并发中的后续操作
对于其的理解,可以解释为,前面一个操作的结果对于后续操作是可见的
也是并发操作的基石
也就是说,Happens-Before规则约束了编译器的优化行为,要求编译器在优化的同时,遵守Happens-Before规则
1..程序的顺序性规则
即为在一个线程中,前面的操作Happens-Before后面的任意操作,程序前面对于某个变量的修改对后续操作是可见的
2.volatile变量的顺序性规则
对一个volatile变量的写,Happens-Before于对于这个变量的读,即对这个读操作可见
这一条通常配合第三条 传递性
3.传递性
简单概述为
A Happens-Before B
B Happens-Before C
那么A Happens-Before C
假设有一个变量 int a = 42
a=42 在同一线程中,happens-before于 volatile boolean x = true
那么对于 x的读取
必然 写 happens-before于 读
那么对于读操作来说, 其他线程必然可以读取到 a = = 42
这就是传递性
4.管程中锁的规则
对一个锁的解锁 Happens-Beofre于对这个锁的加锁
而管程,就是一种对于同步的原语,Java中可以认为就是Synchronized
拿一串代码来方便理解
synchronized (this) { //此处自动加锁
// x是共享变量,初始值=10
if (this.x < 12) {
this.x = 12;
}
} //此处自动解锁
那么可以理解为,线程A进行this.x = 12后进行解锁,然后线程B进入代码块
B可以看见x = = 12
5.线程的start()规则
线程A启动子线程B后,B能够看见主线程A在启动B之前的操作
6.线程的Join()规则
主线程A等待子线程B完成后,在子线程B完成,主线程能够看见,子线程对于共享变量的操作
子线程也就是对共享变量的操作 Happens-Before于 父线程的
那么对于问题,一个线程中设置了abc的值 abc =3 ,对于其他线程,可以通过
加Synchronized使得其对后续线程具有可见性
对于这个共享变量,加上volatile关键字进行修饰
将这个线程作为子线程加入join其他线程中