假设这个类:
public class AmIThreadSafe {
private int a;
private int b;
AmIThreadSafe(int a, int b) {
this.a = a;
this.b = b;
}
}
假设一旦(引用)转义volatile
,某些线程(导致竞争条件)就可以访问该实例对此类(声明为)的引用:this
volatile AmIThreadSafe instance = new AmIThreadSafe(1,2);
在这里,我确信分配instance
引用的事实发生在线程读取之前。
但是AmIThreadSafe's
田野呢?
externalvolatile
关键字是否也暗示了happens-before
与a
和b
字段的关系?或者由于构造函数期间潜在的语句重新排序,是否有可能导致任何线程看到陈旧的值(0
在这种情况下为默认值)?int
换句话说,我应该声明a
和b
final
/或volatile
防止 JMM 出现任何意外,还是仅仅volatile
在实例的引用上表明就足够了?
----------------更新后的帖子 - 一个很好的答案: ---------------------------- -
下面的文章通过它的样本证实了这一点,在我的例子中,a
并且b
受到 JMM 优化的保护,这些优化可以防止永久发生之前的关系。
http://jeremymanson.blogspot.fr/2008/11/what-volatile-means-in-java.html