【发布时间】:2015-01-15 10:10:38
【问题描述】:
我总是看到这样实现的单例:
public class Singleton
{
static Singleton instance;
static object obj = new object();
public static Singleton Instance
{
get
{
lock (obj)
{
if (instance == null)
{
instance = new Singleton();
}
return instance;
}
}
}
protected Singleton() { }
}
这样实现有什么问题吗:
public class Singleton
{
static readonly Singleton instance = new Singleton();
public static Singleton Instance
{
get { return instance; }
}
protected Singleton() { }
}
?它在与第一个实现相同的时刻被延迟初始化,所以我想知道为什么这不是一个流行的解决方案? 它也应该更快,因为不需要条件,锁定并且字段被标记为只读,这将使编译器进行一些优化
请不要谈论单例(反)模式本身
【问题讨论】:
-
您可能有兴趣阅读 Jon Skeet 的 Implementing the Singleton Pattern in C#,向下滚动到“第四版 - 不那么懒惰,但不使用锁是线程安全的”
-
这是一个品味问题。
Lazy<T>还有第三种模式。请注意,您的第一个示例还应该在进入锁之前检查无效性。 -
这样实现没有什么问题(除了你应该将支持字段声明为
readonly)。但请注意,它不像第一个版本那样懒惰,因为对象是在调用类中的静态方法时创建的,而不是在访问属性时创建的。
标签: c#