我一直在寻找能够提供同一类的线程安全和不安全版本的模式。这方面的技术方面非常明显。我想希望找到命名/访问惯例等......
所以我在'Systems.Collections'命名空间中到处找到这个模式:
public class WhatEv
{
private class SyncWhatEv : WhatEv
{
// overrides IsSyncronized = true
// overrides whatever else to make it thread safe
}
public virtual bool IsSynchronized
{
get { return false; }
}
public static WhatEv Synchronized(WhatEv whatEv)
{
return new SyncWhatEv(whatEv);
}
}
有许多类实现这个:HashTable,Queue,ArrayList,Stack等......我理解继承。但是为什么要把它变成一个私有的嵌套类,并让用户跳过一个环节去实现呢?这样做有什么好处吗?
答案 0 :(得分:3)
在大多数情况下,不需要对象的线程安全版本(即Hashtable,Queue)。因此,默认情况下添加使其成为线程安全所需的开销是没有意义的。使用Synchronized方法,允许需要线程安全的用户获得线程安全版本。
除了线程安全之外,对象的同步版本不会添加任何其他功能。他们不会暴露任何新成员,也不知道他们的基础类型真的有帮助。因此,它们是私有的,只是“看起来”像他们的公共/基础类。
答案 1 :(得分:2)
理论上,这是一个好主意,而@CodeNaked有一个很好的解释。实际上,这仍然存在问题。例如,如果您需要对线程安全类进行2次调用,并且两个调用组合都需要线程安全,则仍需要执行锁定。这个SO项目的好解释:In C# would it be better to use Queue.Synchronized or lock() for thread safety?
答案 2 :(得分:-1)
在周末思考这个问题之后,没有得到进一步的回复。我已经确定答案是:MS你们都疯了。提供对象的同步版本的重点是线程安全,但是线程无法在编译时需要线程安全版本的对象。此对象的验证必须在运行时进行,这是......伪造。
感谢大家的投入。我很感激。