如果我们有一个像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
    }
}

07-26 03:49