您的位置:首页 > Web前端 > JavaScript

JSR-133 因果关系

2015-09-29 14:06 543 查看
JSR-133java内存模型与线程规范中文版中第六节因果关系中有如下描述




正确同步的,所以r1 == r2 ==0是唯一合法的行为

6happens-before允许的违规行为

图6中的代码是正确同步的。这看起来有点奇怪,因为里面没有执行任何同步动作。但是,记住,如果程序以顺序一致的方式执行时,没有数据争用,程序就是正确同步的。如果这个代码以顺序一致的方式执行,每个动作都将按程序顺序发生,然后两个写操作就都不会发生了。既然没有写操作,就没有数据争用:该程序就是正确同步的。

因为该程序是正确同步的,所以唯一允许的行为就是顺序一致的行为(所谓“顺序一致的行为”,意思是,任意行为,从外部看来,都与一次顺序一致地执行的结果相同)。然而,在happens-before内存模型下,存在执行结果是r1 == r2 == 1的情况,因为它里面没有synchronizes-with或happens-before边缘,允许每个读操作看到其它线程写的值。”

 

R1==r2==1的情况百思不得其解啊?后来又看了虚拟机的深入理解java虚拟机的先行发生原则,有一点明白。两个线程不存在先行发生的原则那么代码会有编译器或者cpu进行乱序的情况。但是线程内的代码需要满足先行发生原则啊! X=1,y=1的操作在if判断之后,但是两个线程在判断之前的赋值又都是0,不会进入if判断,怎么存在r1==r2==1的情况啊??怎么也想不到r1==r2==1的情况是怎样的。

反复的想,反复的想,考虑出一种情况。如果虚拟机优化,提前将x=1,y=1的赋值先做了。不管if的条件判断结果如何,它都把后续的操作预先处理了,坐等if判断的结果来决定是否使用该预操作。这样的话就可以想通了。

 

先行发生原则











内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息