SLa*_*aks 3 .net c# thread-safety
我有一个类维护一个Dictionary
缓存一些数据的私有实例.
该类使用a从多个线程写入字典ReaderWriterLockSlim
.
我想在课外公开字典的值.
什么是线程安全的方法呢?
现在,我有以下内容:
public ReadOnlyCollection<MyClass> Values() {
using (sync.ReadLock())
return new ReadOnlyCollection<MyClass>(cache.Values.ToArray());
}
Run Code Online (Sandbox Code Playgroud)
有没有办法这样做而不需要多次复制集合?
我正在使用.Net 3.5(不是4.0)
我想在课外公开字典的值.什么是线程安全的方法呢?
你有三个选择.
1)复制数据,分发副本.优点:无需担心线程安全访问数据.缺点:客户获得过时数据的副本,而不是新鲜的最新数据.而且,复制是昂贵的.
2)在读取时,分发一个锁定底层集合的对象.您必须编写自己的只读集合,该集合引用了"父"集合的锁定.仔细设计两个对象,以便无法实现死锁.优点:从客户的角度来看"正常"; 他们获得最新数据,而不必担心锁定.缺点:为您做更多的工作.
3)将问题提交给客户.公开锁定,并要求客户端在使用之前锁定数据本身的所有视图.优点:没有为你工作.缺点:为客户提供更多的工作,他们可能不愿意或无法做的工作.死锁等风险现在成为客户的问题,而不是您的问题.