以下C#代码是否在多线程环境中是线程安全的?

时间:2017-01-18 20:49:29

标签: c# multithreading

由于我一旦有人使用该类就创建了只读静态实例,没有延迟加载,这段代码是线程安全的,我不需要遵循Double-checked locking设计模式,对吗?

public class BusSingleton<T> where T : IEmpireEndpointConfig, new()
{

    private static readonly BusSingleton<T> instance = new BusSingleton<T>();
    private IBus bus;

    public IBus Bus
    {
        get { return this.bus; }
    }

    public static BusSingleton<T> Instance
    {
        get
        {
            return instance;
        }
    }

    private BusSingleton()
    {
        T config = new T();
        bus = NServiceBus.Bus.Create(config.CreateConfiguration());
        ((IStartableBus) bus).Start();
    }
}

2 个答案:

答案 0 :(得分:2)

在静态初始化程序期间,运行时会锁定对象的类型,因此无法同时运行初始化程序的两个实例。

唯一需要注意的是NServiceBus.Bus.Createconfig.CreateConfigurationbus.Start()在内部使用多个线程并尝试在类/函数的任何位置访问对象的类型如果其中一个函数调用中的一个在内部线程完成之后才返回,那么你可能会陷入僵局。

当您使用双重检查锁定执行传统的“懒惰单例”时,静态初始化程序已经完成,您不会冒自己死锁的风险。

因此,如果您确信这3个函数不会尝试在另一个线程上访问您的类型,那么可以不对您的用例使用双重检查锁定。

答案 1 :(得分:0)

只要您不需要延迟实例化以运行初始化代码或类似的东西,这看起来很安全。这听起来像你不需要。 https://msdn.microsoft.com/en-us/library/ff650316.aspx