首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JMM中最终字段的语义

JMM中最终字段的语义
EN

Stack Overflow用户
提问于 2014-08-31 07:22:14
回答 1查看 324关注 0票数 5

在这里[http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.5][1]

上面写着:

给定写w,冻结f,动作a(不是最终字段的读取),被f冻结的最终字段的读r1,以及使hb(w,f),hb(f,a),mc(a,r1)和反式(r1,r2)的读r2,然后在确定r2可以看到哪些值时,我们考虑hb(w,r2)。(这种情况发生-在排序之前不会与其他发生的情况传递关闭-在订货之前。)

他们在这里想说什么?我知道r2只是读取r1读取的最后一个字段值,所以很明显,hb(w,r2),因为r1读取了这个变量的正确版本,因为这个值被f冻结了。很深吗?另外,他们想要说的是,这个hb命令不会与其他hb订单“过渡关闭”?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-31 07:44:34

r1读取由w编写的值的唯一事实并不意味着hb(w, r1),更不用说hb(w, r2)了。情况正好相反:如果在wr1之间发生关系之前就发生了,那么JMM保证将观察到什么值;否则就没有保证。如果r1确实观察到了来自w的值,那只是一个巧合,并不是在特殊情况下导致关系发生之前发生的。

最好的方式来想象一个尖锐的例子,这一点很重要,是通过数据竞争安全发布的用例。对String的引用写入非易失性字段,而不进行同步,然后将该字段从另一个线程中取消引用。如果线程碰巧观察到String (不能保证它会),则可以保证线程将看到String处于一致状态。

如果没有额外发生的特殊规定--在此之前,只有在你方报价所描述的确切情况下才会考虑,则不能保证String将被完整地遵守。

他们想说的是,这个hb订单不会与其他hb订单“临时关闭”吗?

通常情况下,hb(a,b)hb(b,c)意味着hb(a,c),但是这种传递性并不适用于特殊的发生--在因场结冰而存在之前。这些特殊的发生-以前有他们自己的“命名空间”。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25589821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档