继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

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

慕田峪4524236
关注TA
已关注
手记 204
粉丝 19
获赞 51

 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

作者:一起写程序


打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP