2

在阅读“Java Concurrency in Practice”时,我遇到了以下问题 -

为了安全地发布对象,对象的引用和对象的状态必须同时对其他线程可见。正确构造的对象可以通过以下方式安全地发布:

  • 从静态初始化器初始化对象引用;
  • 将对它的引用存储到 volatile 字段或 AtomicReference 中;
  • 将对它的引用存储到正确构造的对象的最终字段中;或者
  • 将对它的引用存储到由锁正确保护的字段中。

我的问题是——第二点是真的吗?即我可以通过将对象的引用存储在易失性引用中来使其他线程可以看到对象的状态吗?如果不是,我是否错误地阅读了上述几点?

4

1 回答 1

2

使对象 volatile 不会使他的状态发布到所有线程,即

volatile A a = new A();
private static class A {
    int i = 0;
    int j = 0;
    int k = 0;
}

不一样

A a = new A();
private static class A {
    volatile int i = 0;
    volatile int j = 0;
    volatile int k = 0;
}

(1) 宁可让您的引用变得易变,即如果一个线程重新分配引用,此重新分配将立即“发布”给其他线程

于 2016-03-24T14:31:13.683 回答