双重检查锁定已损坏。由于初始化是原语,因此它可能不需要易失性即可工作,但是在实例初始化之前,没有什么可以阻止初始化被视为对非同步代码是正确的。
编辑:为了澄清上述答案,原始问题询问有关使用布尔值来控制双重检查锁定的问题。如果没有以上链接中的解决方案,它将无法正常工作。你可以仔细检查锁定,实际上是设置一个布尔值,但是在创建类实例时,仍然存在有关指令重新排序的问题。建议的解决方案不起作用,因为在非同步块中看到初始化的布尔值为true后,实例可能未初始化。
仔细检查锁定的正确解决方案是使用volatile(在实例字段上)而忽略初始化的布尔值,并确保使用JDK 1.5或更高版本,或者在最终字段中对其进行初始化(如链接中所述)文章和汤姆的答案,或者只是不使用它。
当然,整个概念似乎是一个巨大的过早优化,除非你知道在获取此Singleton时将引起大量线程争用,或者你已对应用程序进行了概要分析并将其视为热点。



