mic*_*ael 21 c# locking static-members concurrent-collections
基本上,如果我想做以下事情:
public class SomeClass
{
private static ConcurrentDictionary<..., ...> Cache { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
这是否让我避免lock在整个地方使用s?
Dar*_*rov 32
是的,它是线程安全的,是的,它避免你在整个地方使用锁(无论这意味着什么).当然,这只会为您提供对此字典中存储的数据的线程安全访问,但如果数据本身不是线程安全的,那么您当然需要同步对它的访问.想象一下,例如你已经存储在这个缓存中了List<T>.现在,thread1获取此列表(以并发字典保证的方式以线程安全的方式),然后开始枚举此列表.同时,thread2从缓存中获取这个相同的列表(以并发字典保证这一点的线程安全方式)并写入列表(例如,它添加了一个值).结论:如果你没有同步thread1,它将遇到麻烦.
就使用它作为缓存而言,这可能不是一个好主意.对于缓存,我会向您推荐已构建到框架中的内容.像MemoryCache这样的类.这样做的原因是System.Runtime.Caching组件中内置的内容是为缓存显式构建的=>如果你开始运行内存不足,它会处理数据的自动过期,缓存过期项的回调,你甚至可以使用诸如memcached,AppFabric,...之类的东西在多个服务器上分配缓存,所有这些都是你无法想象的并发字典.