gpt4 book ai didi

c# - 不可变数据结构和并发

转载 作者:太空狗 更新时间:2023-10-30 00:04:36 25 4
gpt4 key购买 nike

我正在尝试了解如何在并发编程中使用不可变数据结构来避免锁定需求。我已经在网上阅读了一些内容,但还没有看到任何具体示例。

例如,假设我们有一些代码 (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不被调用多次?

最佳答案

简短的回答是它没有,至少不完全是。

不可变性仅保证在您使用数据结构时另一个线程无法修改您的数据结构的内容。一旦你有了一个实例,这个实例就永远不能被修改,所以你总是可以安全地阅读它。任何编辑都需要制作实例的副本,但这些副本不会直接干扰任何已引用的实例。

在多线程应用程序中仍然有很多原因需要锁定和同步结构,即使对象是不可变的。它们主要处理与时间相关的问题,例如竞争条件,或控制线程流以便事件在正确的时间发生。不可变对象(immutable对象)不会真正帮助解决这类问题。

不变性使多线程更容易,但它并不容易


至于你关于不可变字典是什么样子的问题。我不得不说,在大多数情况下,在您的示例中,甚至使用不可变字典也没有多大意义。因为它被用作“事件”对象,随着项目的添加和删除而固有地改变。即使在围绕不变性设计的语言中,如 F#,也有用于此目的的可变对象。参见 this link更多细节。可以找到不可变版本 here .

关于c# - 不可变数据结构和并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38662418/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com