假设这个类:
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