volatile参考是否真的能保证对象的内部状态对其他线程可见?

时间:2016-03-24 13:03:34

标签: java multithreading memory-visibility

在阅读“实践中的Java并发”时,我遇到了以下内容 -

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

  • 从静态初始化程序初始化对象引用;
  • 将对它的引用存储到易失性字段或AtomicReference中;
  • 将对它的引用存储到正确构造的对象的最终字段中;或
  • 将对它的引用存储到由锁定正确保护的字段中。

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

1 个答案:

答案 0 :(得分:0)

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

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)更确切地说你的引用是volatile,即如果一个Thread重新分配了引用,那么这个重新分配将被发布"立即到其他主题