在现实世界的Java应用程序中单例模式和破坏双重检查锁定

sau*_*ata 6 java singleton double-checked-locking

我正在阅读文章Double-checked locking和Singleton模式,关于双重检查锁定如何被破坏,以及Stack Overflow上的一些相关问题.

我已经多次使用这种模式/习语而没有任何问题.由于我一直在使用Java 5,我首先想到的是这已经在Java 5内存模型中得到了纠正.然而文章说:

本文引用了Java 5.0之前的Java内存模型; 关于内存排序的陈述可能不再正确.然而,在新的内存模型下,双重检查的锁定习惯仍然被打破.

这是一个真正的问题,如果是这样,在什么条件下?

Ste*_*n C 2

人们很难确定他们的应用程序实际上受到了双重检查锁定故障的影响。事实上,由于各种原因,许多使用此习惯用法的应用程序可能永远不会遇到该问题。

但是,这并不意味着您应该使用它。仅存在不可量化的失败概率这一事实就足以说服您不要使用双重检查锁定,特别是因为有安全的替代方案。

你只是很幸运。