第二篇:Happens-Before

编译器会对程序进行优化,会调整代码的顺序。如果贸然调整顺序的话,可能会引发线程不安全!
Java指定了Happens-Before六条规则,要求编译器必须满足Happens-Before原则,来控制数据的内存可见性。Happens-Before就是在什么之前发生的意思。

1、在同一线程中,按照程序代码的顺序,前面的操作happens-before 后面的操作。也就是说前面操作的结果对于后面是可见的。

x = 40;
y = 60;

当执行y = 60的时候,之前对x的更改为40的操作是可见的。

2、volatile写操作happens-before后续的读操作,读操作对于之前的写操作是可见的。

当前面的volatile变量发生写操作时,后面的语句对这个写操作是可见的。

3、传递性
如果 A happens-before B,B happens-before c ,那么 A happens-before C,也就是A的操作对C同样可见。

4、加锁的可见。如果A线程 happens-before B线程拥有锁,那么A线程在拥有锁期间的所有操作对B线程是可见的。

5、线程start()的可见。如果A线程调用了B线程,那么在B线程对A线程在调用B线程之前的所有操作可见

6、线程join()的可见。如果主线程A调用了B线程的join方法,那么在B线程结束之后,A线程对B线程中的操作是可见的。

上述中说的所有可见的意思就是,他们拥有的共享变量的写操作可见。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值