gpt4 book ai didi

c# - 更新对不可变对象(immutable对象)的引用的首选方法是什么?

转载 作者:行者123 更新时间:2023-11-30 13:47:35 24 4
gpt4 key购买 nike

如果我们有一个像 ImmutableList() 这样的不可变对象(immutable对象)。在多线程环境中使用此对象的首选方法是什么?

例如

public class MutableListOfObjects()
{
private volatile ImmutableList objList;

public class MutableListOfObjects()
{
objList = new ImmutableList();
}

void Add(object o)
{
// Adding a new object to a list will create a new list to ensure immutability of lists.

// Is declaring the object as volatile enough or do we want to
// use other threading concepts?
objList = objList.Add(o);
}

// Will objList always use that lest version of the list
bool Exist(object o)
{
return objList.Exist(o);
}
}

声明引用 volatile 是否足以实现所需的行为?还是使用其他线程函数更可取?

最佳答案

“首选”是上下文相关的。 最简单的方法是使用 lock ,并且在大多数情况下,这将非常有效地完成工作。如果你有充分的理由认为 lock是个问题,那么Interlocked很有用:

bool retry;
do {
var snapshot = objList;
var combined = snapshot.Add(o);
retry = Interlocked.CompareExchange(ref objList, combined, snapshot)
!= snapshot;
} while(retry);

这基本上适用于乐观的但经过检查的路径:大部分时间通过,它只会通过一次。偶尔有人会更改 objList 的值当我们不在寻找时 - 没关系,我们再试一次。

但是,真正知道他们在说什么的人已经预先封装了线程安全列表等的实现。考虑使用 ConcurrentBag<T>等。或者只是一个List<T>lock .

关于c# - 更新对不可变对象(immutable对象)的引用的首选方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16520816/

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