C# 在C中这样定义单例是正确的吗?
我个人认为 也就是说: 你的代码不安全,因为C# 在C中这样定义单例是正确的吗?,c#,C#,我个人认为 也就是说: 你的代码不安全,因为 class MyClass { private MyClass(){} private static MyClass instance; public static MyClass Instance { get { return instance=instance??new MyClass(); } } } 它不是原子的 处理许多与创建单例类有
class MyClass
{
private MyClass(){}
private static MyClass instance;
public static MyClass Instance
{
get
{
return instance=instance??new MyClass();
}
}
}
它不是原子的
处理许多与创建单例类有关的问题
因此:
公共类MyClass
{
公共静态MyClass实例
{
得到
{
返回instanceLazy.Value;
}
}
私有静态惰性instanceLazy=
new Lazy(()=>new MyClass());
私有MyClass()
{
}
}
在多线程方面绝对没有。如果只有一个线程,为什么需要单线程?您应该在代码中添加锁。关于?
它会起作用,但我更愿意用更普通的方式来写,如果,请阅读。您的代码在“第一个版本-非线程安全”中显示为错误示例。正确的方法是不定义单例。这是愚蠢设计的首字母缩略词的一部分,这是有原因的。相反,请考虑SOLID design。非常感谢您关注我的多线程安全性,我甚至不知道这一点。当有人提到单线程时,我总是想知道它的范围是什么?每个线程、每个(虚拟)计算机、计算机集群、数据中心只有一个实例,或者实际上世界上只有一个实例?请注意,Lazy在.NET 4及更高版本中可用。(如果您想在早期版本中实现类似的功能,请参考源代码。)感谢您的回复。上面提到的线程安全问题呢?这满足多线程安全标准?是的。在默认模式下,Lazy
是线程安全的。
return instance = instance ?? new MyClass();
public class MyClass
{
public static MyClass Instance
{
get
{
return instanceLazy.Value;
}
}
private static Lazy<MyClass> instanceLazy =
new Lazy<MyClass>(() => new MyClass());
private MyClass()
{
}
}