由于我在有人使用该类时立即创建只读静态实例,因此没有延迟加载,因此此代码是线程安全的,我不需要遵循 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();
}
}
最佳答案
在静态初始化程序期间,运行时会锁定对象的类型,因此初始化程序的两个实例不能同时运行。
唯一需要注意的是NServiceBus.Bus.Create
、config.CreateConfiguration
或bus.Start()
在内部使用多个线程并尝试在另一个线程上的类/函数中的任何位置访问对象的类型,如果这三个函数调用之一直到该内部线程完成后才返回,您可能会陷入死锁。
当您使用双重检查锁定执行传统的“惰性单例”时,静态初始化程序将已经完成,并且您不会冒自己陷入死锁的风险。
因此,如果您确信这 3 个函数不会尝试在另一个线程上访问您的类型,那么最好不要在您的用例中使用双重检查锁定。
关于c# - 以下 C# 代码在多线程环境中是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41729183/