ConcurrentDictionary是否是线程安全的,我可以将它用于静态缓存?

基本上,如果我想做以下事情:

public class SomeClass { private static ConcurrentDictionary Cache { get; set; } } 

这是否让我避免在整个地方使用lock

是的,它是线程安全的,是的,它避免你在整个地方使用锁 (无论这意味着什么)。 当然,这只会为您提供对此字典中存储的数据的线程安全访问,但如果数据本身不是线程安全的,那么您当然需要同步对它的访问。 想象一下,例如,您已在此缓存中存储了List 。 现在thread1获取此列表(以并发字典保证的方式以线程安全的方式),然后开始枚举此列表。 同时,thread2从缓存中获取这个相同的列表(以并发字典保证这一点的线程安全方式)并写入列表(例如,它添加了一个值)。 结论:如果你没有同步thread1,它将遇到麻烦。

就使用它作为缓存而言,这可能不是一个好主意。 对于缓存,我会向您推荐已构建到框架中的内容。 像MemoryCache这样的类。 这样做的原因是System.Runtime.Caching程序集中内置的内容是为缓存显式构建的=>如果你开始运行内存不足,它会处理数据自动过期,缓存过期项目的回调,以及你甚至可以使用诸如memcached,AppFabric,…之类的东西在多个服务器上分发你的缓存,所有这些都是你无法想象的并发字典。

您可能仍需要以与数据库中可能需要事务相同的方式使用锁定。 “并发”部分意味着字典将继续在多个线程中正常运行。

TryGetValue和TryRemove内置于并发集合中,它确认某人可能首先删除项目。 内置锁定在粒度级别,但您仍需要考虑在这些情况下要执行的操作。 对于缓存,它通常无关紧要 – 即它是幂等操作。

re:缓存。 我觉得这取决于你在缓存中存储的内容+你正在使用它做什么。 与使用对象相关的铸造成本。 对于大多数基于Web的事情,MemCache可能更适合上面的建议。