在针对双重检查锁定场景的乱序写入所提到的示例中(引用: IBM article & Wikipedia Article )
我无法理解为什么 Thread1 会在构造函数完全初始化之前退出同步块(synchronized block)的简单原因。根据我的理解,创建“new”和调用构造函数应该按顺序执行,并且在所有工作未完成之前不应释放同步锁。
请让我知道我在这里缺少什么。
最佳答案
构造函数可能已经完成 - 但这并不意味着该构造函数中涉及的所有写入都已对其他线程可见。糟糕的情况是,在对象的内容变得可见之前,引用 对其他线程可见(因此他们开始使用它)。
您可能会找到 Bill Pugh's article on it也有助于阐明一点。
就我个人而言,我只是避免像瘟疫一样避免双重检查锁定,而不是试图让它全部正常工作。
关于java - 双重检查锁定的乱序写入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11195389/