相关疑难解决方法(0)

我也需要针对参考类型变量的volatile吗?

我们经常使用它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不会像原始类型一样进行缓存.

是对的吗?

java caching jvm visibility volatile

24
推荐指数
2
解决办法
6397
查看次数

参考类型的易失性 - 是否始终避免因JMM而发布引用问题?

假设这堂课:

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关系ab字段?或者由于在构造函数中重新排序的潜在语句,是否有可能最终看到任何线程看到陈旧值(0在本例中为默认值int)?

换句话说,我应该声明a和/ b finalvolatile防止JMM出现任何意外,或者只是volatile在实例的参考上做出足够的指示?

---------------- 更新的帖子 - 一个好的答案: --------------------------- -

以下文章通过其样本确认,在我的情况下,a并且b受到JMM优化的保护,这些优化可以防止永久发生之前的 …

java concurrency multithreading volatile thread-safety

7
推荐指数
1
解决办法
2054
查看次数