为了账号安全,请及时绑定邮箱和手机立即绑定

操作时间的先后顺序和先行发生(happens-before)之间没有必然关系?

标签:
Java

 happens-before原则的作用:判断两个操作之间是否存在冲突。如果符合happens-before规则,是不存在冲突。不符合happens-before规则,就需要自己处理线程安全的问题。

 

 操作时间的先后顺序和先行发生(happens-before)之间没有必然关系?

 也就是先行发生(happens - before)原则,不是说执行的时间顺序。这句话怎么理解。

例如:一个线程执行 i = 1 ; j =2; 

按照happens-before原则中的程序次序原则(一般是代码在前先执行原则),i =1 操作先行于 j = 2; 

但cpu完全有可能先执行i的初始化为0,然后cpu执行完 j = 2 再执行,i = 1,这样的结果也是正确的。所以说时间上先执行的, 并没有先行发生。

happens-before原则的: 以下几条操作是不需要考虑线程安全问题的,

程序次序规则(program order rule): 在一个线程内,先在前面的代码操作先行。准确的说控制流顺序而不是代码顺序。需要考虑分支,循环等结构。 

管程锁定规则(monitor lock rule):同一个资源锁,先unlock,之后才能lock。 

Volatile变量规则(volatile variable rule):一个变量被volatile修饰,多线程操作,先执行操作,再执行读操作。(同时写操作只能有一个) 

线程启动规则(Thread start rule):Thread对象的start方法,先行发生于此线程的每一个方法。

 线程终止规则(Thread Termination rule):该线程的所有方法,先行发生于该线程的终止检测方法。例如:可以通过Thread.join方法结束,Thread.isAlive()的返回值等手段检测到线程已经终止执行。 

线程中断规则(Thread Interruption Rule):  中断方法先行发生于,中断检测方法。中断方法interrupt(),中断检测interrupted()方法。

 对象终结规则(finalizer rule):  一个对象的初始化完成(构造函数执行结束)先行发生于它的finalizer方法的开始。 

传递性(Transitivity): 如果操作A先行发生于操作B,操作B先行发生于操作C,那就可以得出操作A先行发生于操作C的结论。

原文链接:https://mp.weixin.qq.com/s/jEvpE2NHFBR56-NtFwQu_A

作者:一起写程序


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消