【问题标题】:Unity "ContainerControlled" Singletons and multi-threaded method callingUnity“ContainerControlled”单例和多线程方法调用
【发布时间】:2014-10-17 13:45:12
【问题描述】:

我正在使用 Microsoft Unity 进行依赖注入 (DI)。我的类基本上是静态的(在功能上,但不是编码/调用约定),除了我想要 DI,所以我使用自动解析其他 Unity 类的 Unity 和 Constructors。

既然这是一个单例模式,多个线程可以同时执行同一个代码块吗?

即假设我有一个 Add 方法,它返回一个 int,并将两个 int 作为输入...

多线程能否同时在同一个单例对象上调用此 Add 方法?还是因为是同一个实例,线程阻塞等待调用?

换句话说,调用静态方法和单例实例方法的方法有什么区别吗?

(我知道在单例实例方法中使用的任何共享数据都必须是线程安全的)

【问题讨论】:

    标签: c# multithreading dependency-injection singleton unity-container


    【解决方案1】:

    没有区别。只有当您有一些需要保护的共享状态时,线程安全才是重要的。像您描述的方法 - 简单的添加操作 - 在调用堆栈中获取所有相关上下文不需要保护,因此您可以在多线程环境中安全地使用它。

    当然,实例方法调用和静态方法调用在功能和非功能领域是有区别的。静态方法被认为比实例方法快得可以忽略不计,但它们不能有效地用于多态软件设计——(嗯,至少在 C# 中不是)

    【讨论】:

    • 所以多个线程同时从同一个对象调用同一个实例方法是没有阻塞的,对吗?
    • 正确。没有阻塞,除非你想让它阻塞,在这种情况下你使用 lock 语句。