【发布时间】:2009-10-20 11:37:55
【问题描述】:
这个问题是this one 的延续。交易很简单。
鉴于:
- 懒惰创建的单例集合。
- 多线程环境。
通缉:
- 当访问已创建的对象时,尽可能减少锁定损失的实现。对新对象的删除或延迟初始化支付更高的惩罚是可以的。
让我们考虑一下单例的老式 C++ 风格实现,用作 if-lock-if 模式的说明:
public static SomeType Instance
{
get
{
if (m_instance == null)
{
lock(m_lock)
{
if (m_instance == null)
{
m_instance = new SomeType();
}
}
}
return m_instance;
}
}
同样,这只是 if-lock-if 模式的一个说明。
显然,在访问已构造的对象时根本没有锁损失。当特定对象已经创建时,是否可以本着保持惩罚最小的相同精神设计一组延迟创建的对象?移走物件时罚款较高。
谢谢。
编辑:
我已经重写了这个问题,完全删除了单例这个词,因为人们往往过于关注它而不是问题的核心。
【问题讨论】:
-
我不认为单例在这里是正确的名字,如果他们都是
SomeType类型的话 -
SomeType 可以是接口,也可以是基本类型。真的没关系。
-
单例设计模式最近已经失宠,因为它相当于全局状态(尤其是可变状态时)并降低了可测试性。您是否考虑过其他选项,例如 IoC 容器框架提供的生命周期管理?
-
感谢您的建议。我已经更新了我的问题。
-
这种模式称为“双重检查锁定”,而不是“if-lock-if”。它在一般情况下也会被破坏(例如,在 Java 中,它只有在 m_instance 是 volatile 时才会起作用)。
标签: .net multithreading singleton