在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其他线程中

发表评论

邮箱地址不会被公开。 必填项已用*标注