
不,您永远不会获得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。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)