java - volatile 引用真的能保证对象的内部状态对其他线程可见吗?

标签 java multithreading memory-visibility

在阅读《Java 并发实践》时,我发现了以下内容 -

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

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

我的问题是 - 第二点是真的吗? IE。我可以通过将对象的引用存储在 volatile 引用中来使对象的状态对其他线程可见吗?如果不是,我是否错误地阅读了上述几点?

最佳答案

使对象 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) 相反,使您的引用不稳定,即如果一个线程重新分配引用,则此重新分配将立即“发布”到其他线程

关于java - volatile 引用真的能保证对象的内部状态对其他线程可见吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36200870/

相关文章:

java - 为什么 URI 构造函数允许缺少协议(protocol)(而 URL 则不允许)?

java - 在正确的时间启动具有 Intent 过滤器的 Activity

java - java匿名内部类实现Runnable共享外部类对象线程安全吗?

java - 为什么这个 Java 程序会终止,尽管它显然不应该(也不应该)?

java - jvm重排序/可见性效果测试

java - GAE : Cannot set admin login credential for module http requests

java - 无法将属性从 Controller 传递到 View

Android:在 SQLite 数据库上写入多线程

multithreading - BeginThread 结构 - Delphi

python - 如何在 Python 中多次调用一个线程?