gpt4 book ai didi

java - 引用类型的 volatile - 它是否总是避免由于 JMM 而发布引用问题?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:12:12 25 4
gpt4 key购买 nike

假设这个类:

public class AmIThreadSafe {

private int a;
private int b;

AmIThreadSafe(int a, int b) {
this.a = a;
this.b = b;
}
}

假设一旦 this(reference) 转义,某些线程就可以访问该实例对此类的引用(声明为 volatile)(导致竞争条件):

volatile AmIThreadSafe instance = new AmIThreadSafe(1,2);

在这里,我确定分配实例引用的事实发生在线程读取之前。

但是AmIThreadSafe 的 字段呢?

外部 volatile 关键字是否也暗示了与 ab 字段相关的 happens-before 关系?或者是否有可能由于构造函数期间潜在的语句重新排序而导致任何线程看到陈旧值(在本例中为默认值 0,因为 int)?

换句话说,我应该声明 ab final 还是 volatile 以防止任何意外JMM 还是仅在实例的引用上指示 volatile 就足够了?

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

以下文章通过其示例确认,在我的案例中,ab 受到保护,不受 JMM 优化的影响,这些优化防止永久性的happens-before 关系。

http://jeremymanson.blogspot.fr/2008/11/what-volatile-means-in-java.html

最佳答案

instance 声明为 volatile 不会使其字段成为 volatile,但如果我正确理解您的问题,那么 — 是的,这就足够了你的情况。

根据 §17.4.5 of the spec :

  • volatile 在一个线程中写入 发生在 任何后续 volatile 在另一个线程中读取。
  • 同一线程中的语句具有您所期望的先行关系。
  • happens-before 关系是可传递的。

所以,如果一个线程认为 instance 已经被初始化,那么 instance 的初始化 happened-before 它的初始化instance 的字段happened-before,因此线程会认为 instance 的字段已被初始化。

关于java - 引用类型的 volatile - 它是否总是避免由于 JMM 而发布引用问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13371066/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com