这是来自http://www.ibm.com/developerworks/java/library/j-dcl/index.html的 Java 示例问题
public static Singleton getInstance()
{
if (instance == null) //#4
{
synchronized(Singleton.class) { //#1
if (instance == null) //#2
instance = new Singleton(); //#3
}
}
return instance;
}
这似乎是不安全的,因为 #3 可以在构造函数执行之前将实例设置为非空,因此当另一个线程检查 #4 上的实例时,它不会为空并返回一个未正确构造的实例。
显然使用函数变量不会有帮助,因为它可能会被优化或者只是以一种在我们不希望它时也将值设置为实例的方式执行。
我在想最简单的方法不是拥有一个函数new Singleton();
,因此在将其分配给实例之前完成它。现在的问题是我如何告诉 C++ 一个函数不应该是内联的?我认为 Singleton* make_singleton() volatile
应该这样做,但我很肯定我错了。