如果我们有一个像ImmutableList()这样的不可变对象。在多线程环境中使用此对象的首选方法是什么?
例如
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);
}
}
声明参考挥发物是否足以实现所需的行为?还是最好使用其他线程功能?
最佳答案
您的添加是非原子的,因此容易受到竞争条件的影响。例如:
void Add(object o)
{
// This code is not thread safe:
objList = objList.Add(o); // context switch after add, before assignment == bad
}
因此,您添加到一个新列表,但是在分配发生之前,另一个线程进入...添加了其他东西,即分配。您之前的线程进行了分配。哎呀。
您需要将分配包装在锁中:
void Add(object o)
{
lock(objList)
{
objList = objList.Add(o); // only one thread can do this at any given time
}
}