【发布时间】:2016-07-30 00:06:00
【问题描述】:
我试图了解如何在并发编程中使用不可变数据结构来消除对锁定的需求。我在网上读过一些东西,但还没有看到任何具体的例子。
例如,假设我们有一些代码 (C#) 在 Dictionary< string, object> 周围使用锁:
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? -
如何防止昂贵的Fn被调用两次?
-
因为
ConcurrentDictionary已经有一个方法可以完全按照您的方法为Dictionary所做的工作,除了它由MS 有效地调整,并且具有支持更高效的多线程访问的底层存储结构。跨度> -
我试图了解使用不可变数据结构如何简化并发编程并消除对锁的需求。不确定 ConcurrentDictionary 对此有何帮助
-
@Servy 我认为他的观点是,这段特定的代码不是解决现实世界问题的一部分,他只是想了解使用不可变数据结构如何改变你做并发。使用 ConcurrentDictionary 是解决现实世界问题的完美解决方案,但它无助于他对这个特定问题的理解。
标签: c# concurrency immutability