双重检查锁定的无序写入

San*_*dal 4 java multithreading synchronization jls double-checked-locking

在针对双重检查锁定方案的无序写入中提到的示例中(参考: IBM文章维基百科文章)

在构造函数完全初始化之前,我无法理解为什么Thread1会在同步块中出现的简单原因.根据我的理解,创建"new"和调用构造函数应该按顺序执行,同步锁不应该释放,直到所有工作都没有完成.

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

Jon*_*eet 12

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

你可能会发现Bill Pugh关于它的文章也有助于揭开一些亮点.

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