【发布时间】:2013-05-07 06:22:16
【问题描述】:
这是来自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 应该这样做,但我很肯定我错了。
【问题讨论】:
-
我有点困惑。您问题中的文章和代码是关于 Java 的,然后您在谈论 C++11。您是否想弄清楚如何在 C++ 中实现这个习语?如果是这样,您链接的文章已经讨论了为什么 Java 版本不起作用。你的 C++ 函数是什么样的?
-
恐怕你会一直吸引那些缺乏阅读理解力并认为你在谈论 Java 的人投反对票。
-
不要使用单例。 :)
-
@GManNickG: :D 我从不这样做。
new在使用线程时可能会遇到问题,这让我很烦恼
标签: c++ c++11 concurrency race-condition