我正在尝试理解如何在并发编程中使用不可变数据结构可以避免需要锁定。我在网上看了一些文章,但还没有看到任何具体的例子。
例如,假设我们有一些代码(C#),在
例如,假设我们有一些代码(C#),在
Dictionary< string,object>
周围使用锁定(s)来执行以下操作:class Cache
{
private readonly Dictionary<string, object> _cache = new Dictionary<string, object>();
private readonly object _lock = new object();
object Get(string key, Func<object> expensiveFn)
{
if (!_cache.ContainsKey("key"))
{
lock (_lock)
{
if (!_cache.ContainsKey("key"))
_cache["key"] = expensiveFn();
}
}
return _cache["key"];
}
}
如果_cache
是不可变的,那会是什么样子呢?是否可以删除lock
并确保expensiveFn
不会被调用多次?
ConcurrentDictionary
呢? - ServyConcurrentDictionary
已经有一个方法可以完全替代你的Dictionary
方法,而且它是由微软高效调优的,并且具有支持更有效的多线程访问的底层存储结构。 - Servy