c# - 这个 Singleton 实现是否正确且线程安全?

标签 c# multithreading singleton

这个单例实现是否正确且线程安全?

class Class
{
    public static readonly Class Instance;

    static Class()
    {
        Instance = new Class();
    }

    private Class() {}
}

最佳答案

从技术上讲,您的版本应该可以工作。但是,我不建议在 Singleton 类中公开公共(public)字段,而更喜欢使用 Property(仅使用 getter)。如果您以后需要进行更改,这将帮助您的 API 面向 future 。我还建议密封任何单例实现,因为子类化单例类几乎总是一个坏主意并且有问题。

如果您的目标是 .NET 3.5 或更早版本,我个人会在 C# 中使用以下代码:

public sealed class Singleton
{
    static readonly Singleton instance = new Singleton();

    public static Singleton Instance
    {
        get
        {
            return instance;
        }
    }

    static Singleton() { }
    private Singleton() { }
}

如果您使用的是 .NET 4,您可以通过 Lazy<T> 使这对您自己来说更容易。 :

public sealed class Singleton
{
     private static readonly Lazy<Singleton> instance = new Lazy<Singleton>( () => new Singleton() );
     private Singleton() {}
     public static Singleton Instance { get { return instance.Value; } }
}

.NET 4 版本还具有完全惰性的优势 - 即使您的 Singleton类具有在访问“实例”属性之前使用的其他静态方法。您也可以通过使用私有(private)嵌套类来实现完全惰性的 .NET 3.5 版本。 Jon Skeet demonstrated this on his blog .

关于c# - 这个 Singleton 实现是否正确且线程安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3136008/

相关文章:

c# - SynchronizationContext.Send 调用 Func 返回结果

c++ - 将方法作为参数传递给另一个方法,该方法本身将传递的方法传递给标准线程

Java 原子特性与有效 Java 摘录

java - 如何多次实例化一个单例?

java - Java 给定运行时存储中的持久存储

c# - 为什么 System.TimeSpan 不是可序列化的 XML?

c# List<T> 排序 : by Chinese strokes

java - 使用java中的线程进行文件的多个副本

javascript - 引用 JS 对象中的内部变量

c# - ActiveMQ - 没有从 DurableConsumer 收到主题消息