易失性担保和无序执行

易失性担保和无序执行,第1张

易失性担保和无序执行

不,您永远不会获得NPE。这是因为

volatile
也具有引入事前发生关系的记忆效果。换句话说,它将防止重新排序

a = one;b = two;

上面的语句,会不会重新排序,并将所有线程将观察值

one
a
,如果
b
已经有了价值
two

这是David
Holmes在其中进行解释的线程:http
:
//markmail.org/message/j7omtqqh6ypwshfv#query
:+
page
:1+
mid
:
34dnnukruu23ywzy+state
results

编辑(对后续措施的回应):福尔摩斯说的是,如果只有线程A ,则编译器 理论上
可以进行重新排序。但是,还有其他线程,它们可以检测到重新排序。这就是为什么不允许编译器进行重新排序的原因。Java内存模型要求编译器专门确保没有线程能够检测到这种重新排序。

但是,如果有人从另一个线程而不是setBothNonNull(…)调用doIt()呢?

不,您永远不会拥有NPE。

volatile
语义确实强加了线程间排序。这意味着,对于所有现有线程,的分配
one
发生在的分配之前
two



欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5478342.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-12
下一篇2022-12-12

发表评论

登录后才能评论

评论列表(0条)

    保存