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

标签 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();
    }
}

最佳答案

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

唯一需要注意的是NServiceBus.Bus.Createconfig.CreateConfigurationbus.Start()在内部使用多个线程并尝试在另一个线程上的类/函数中的任何位置访问对象的类型,如果这三个函数调用之一直到该内部线程完成后才返回,您可能会陷入死锁。

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

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

关于c# - 以下 C# 代码在多线程环境中是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41729183/

相关文章:

java - 同一对象上的同步块(synchronized block)是否真的阻止其他线程执行该 block ?

multithreading - Grails 1.3.7- Multi-Tenancy 插件和多线程操作-线程无法访问租户

c# - 创建模型时无法使用上下文异常

c# - WPF 框架控件

c# - 使用 lambda 函数重写此数组操作?

c++ - 如何使用 QMutex?

java - 如何在并行线程中执行 observable

c# - C# 中真正的低级声音生成?

c# - IEnumerable <T>的实现适用于foreach,但不适用于LINQ

c - 如何退出被信号量挂起的线程?