【发布时间】:2015-12-30 07:31:33
【问题描述】:
我正在阅读 B. Goetz Java Concurrency In practice,现在我在 section 3.5 关于安全发布。他说:
// Unsafe publication
public Holder holder;
public void initialize() {
holder = new Holder(42);
}
这个不正当的发布可能允许另一个线程观察到 部分构造的对象。
我不明白为什么可以观察到部分构造的子对象。假设构造函数Holder(int) 不允许this 逃逸。因此,构造的引用只能由调用者观察。现在,正如JLS 17.7 所说:
对引用的写入和读取始终是原子的,无论 它们是作为 32 位还是 64 位值实现的。
线程不可能观察到部分构造的对象。
我哪里错了?
【问题讨论】:
-
顺便说一句,我刚刚点击了您提供的 JCIP 链接,我注意到这是本书的全文! Afaik,JCIP 仍受版权保护,该副本不应该在那里。这是github的人要监控和处理的事情,但是我这里分享链接是不合适的。
-
@yshavit 是的,但我想既然它是在 github 上发布的,那还不如在这里发布……我想 Brian Goetz 知道这件事……
-
“它在 github”与“我可以下载它”一样,不能保证合法分发。在其网站jcip.net 上没有该书的免费许可副本。这几乎可以肯定是盗版链接,您应该删除它。
标签: java multithreading