java - 双重检查锁定的乱序写入

标签 java multithreading synchronization jls double-checked-locking

在针对双重检查锁定场景的乱序写入所提到的示例中(引用: IBM article & Wikipedia Article )

我无法理解为什么 Thread1 会在构造函数完全初始化之前退出同步块(synchronized block)的简单原因。根据我的理解,创建“new”和调用构造函数应该按顺序执行,并且在所有工作未完成之前不应释放同步锁。

请让我知道我在这里缺少什么。

最佳答案

构造函数可能已经完成 - 但这并不意味着该构造函数中涉及的所有写入都已对其他线程可见。糟糕的情况是,在对象的内容变得可见之前,引用 对其他线程可见(因此他们开始使用它)。

您可能会找到 Bill Pugh's article on it也有助于阐明一点。

就我个人而言,我只是避免像瘟疫一样避免双重检查锁定,而不是试图让它全部正常工作。

关于java - 双重检查锁定的乱序写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11195389/

相关文章:

java - 使用 SAX 解析器解析包含元音变音符的 XML 文件

java - S4s-elt-must-match.1:“全部”的内容必须匹配(注释?,元素*)

java - 如何使用 IntelliJ IDEA 查找所有未使用的代码?

java - servlet如何工作?实例化, session ,共享变量和多线程

iphone - 如何在同一网络中的多部 iPhone 上同步应用程序状态?

java - 从服务器向所有连接的客户端显示在线用户

java - (Java) 线程在异常捕获处莫名其妙地停止

java - 在java中运行多少个线程?

c++ - 在 C++ 中从另一个进程解锁线程

c++ - 如何同步访问多个对象