3

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);
   }
}

目的の動作を実現するには、参照を volatile と宣言するだけで十分ですか? それとも、他のスレッド関数を使用する方が望ましいですか?

4

3 に答える 3

0

volatileこの場合は役に立ちません。読み取りobjList、呼び出しAdd()、および割り当ての間のロックは作成されませんobjList。代わりにロック機構を使用する必要があります。volatile操作の再割り当てから保護するだけです。

あなたの場合、オブジェクトが追加されるたびに新しいリストを作成しています-通常、はるかに良い代替手段は、ローカルスレッド変数内にリストを作成することです(マルチスレッドの問題の影響を受けないようにするため)。不変としてマークするか、不変のラッパーを作成します。これにより、パフォーマンスとメモリ使用量が大幅に向上します。

于 2013-05-13T11:26:34.910 に答える