我们经常使用它volatile来确保每个Thread都可以看到一个条件变量.
到目前为止,我看到这些volatile字段都是primitive type代码.
请问object现场有这个问题?例如:
class a {
public String str;
public List list;
}
Run Code Online (Sandbox Code Playgroud)
如果有一些线程会访问str和list,我必须添加'volatile'吗?
我想每次访问都Object将直接从中获取Heap,并且Object不会像原始类型一样进行缓存.
是对的吗?
假设这堂课:
public class AmIThreadSafe {
private int a;
private int b;
AmIThreadSafe(int a, int b) {
this.a = a;
this.b = b;
}
}
Run Code Online (Sandbox Code Playgroud)
假设volatile一旦this(引用)转义,某个线程可以访问实例对此类的引用(声明为)(导致竞争条件):
volatile AmIThreadSafe instance = new AmIThreadSafe(1,2);
Run Code Online (Sandbox Code Playgroud)
在这里,我确信分配instance引用的事实发生在线程读取之前.
但那些AmIThreadSafe's领域呢?
外部volatile关键字是否也暗示happens-before关系a和b字段?或者由于在构造函数中重新排序的潜在语句,是否有可能最终看到任何线程看到陈旧值(0在本例中为默认值int)?
换句话说,我应该声明a和/ b final或volatile防止JMM出现任何意外,或者只是volatile在实例的参考上做出足够的指示?
---------------- 更新的帖子 - 一个好的答案: --------------------------- -
以下文章通过其样本确认,在我的情况下,a并且b受到JMM优化的保护,这些优化可以防止永久发生之前的 …