【发布时间】:2023-04-05 20:14:01
【问题描述】:
我一直在寻找一种能够同时提供同一类的线程安全和不安全版本的模式。这其中的技术方面非常明显。我想是希望找到命名/访问约定等...
所以我在“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 等……我理解继承。但是为什么要让它成为一个私有的、嵌套的类并让用户跳过一个圈子来获得它呢?这样做有什么好处吗?
【问题讨论】:
-
感谢您迄今为止的意见。我只是想想象一个场景,其中用户想要接收基类而不知道它是线程安全的。如果接收者是线程,它应该需要线程安全版本,对吗?如果接收者不是,那它为什么要关心?
-
如果您将从两个线程访问它,则两者都需要使用相同的同步实例。您不能只让接收者使用同步实例,而主线程使用非同步版本。因此,如果该对象有任何机会被另一个线程访问,则应该对其进行同步。但请参阅 Joel 对一个潜在问题的回答。
-
@Naked - 同意。但是 SyncWhatEv 继承了 WhatEv。因此,SyncWhatEv 的同一个实例可以在主线程上作为 WhatEv 类型使用,并且工作线程需要作为 SyncWhatEv 类型。只是,这是不可能的,因为 SyncWhatEv 是私有的。目前,线程必须仔细检查 IsSynchronized 并在为 false 时抛出。
标签: .net synchronization thread-safety design-patterns