C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#でArrayListの同期ラッパーを作成する方法

マルチスレッド環境でArrayListを安全に操作するには、同期(スレッドセーフ)ラッパーを作成する必要があります。C#では、静的メソッドArrayList.Synchronized()を使うことで、既存のArrayListをラップする同期ラッパーを簡単に取得できます。

まず、通常のArrayListがデフォルトでは同期されていないことを確認するサンプルコードを見てみましょう。

例1:通常のArrayListの同期状態を確認する

using System;
using System.Collections;

public class Demo {
   public static void Main() {
      ArrayList arrList = new ArrayList();
      arrList.Add("AB");
      arrList.Add("CD");
      arrList.Add("EF");
      arrList.Add("GH");
      arrList.Add("IJ");
      arrList.Add("KL");

      Console.WriteLine("ArrayListの要素...");
      foreach(string str in arrList) {
         Console.WriteLine(str);
      }

      Console.WriteLine("ArrayListは同期されているか = " + arrList.IsSynchronized);
   }
}

実行結果

ArrayListの要素...
AB
CD
EF
GH
IJ
KL
ArrayListは同期されているか = False

このように、IsSynchronizedプロパティは「False」を返します。これは、通常のArrayListがスレッドセーフではないことを意味しています。

例2:ArrayList.Synchronized()で同期ラッパーを作成する

続いて、ArrayList.Synchronized()メソッドを使って同期ラッパーを作成する例を紹介します。

using System;
using System.Collections;

public class Demo {
   public static void Main() {
      ArrayList arrList = new ArrayList();
      arrList.Add("AB");
      arrList.Add("CD");
      arrList.Add("EF");
      arrList.Add("GH");
      arrList.Add("IJ");
      arrList.Add("KL");

      Console.WriteLine("ArrayListの要素...");
      foreach(string str in arrList) {
         Console.WriteLine(str);
      }

      Console.WriteLine("ArrayListは同期されているか = " + arrList.IsSynchronized);

      // 同期ラッパーを作成
      ArrayList arrList2 = ArrayList.Synchronized(arrList);
      Console.WriteLine("同期ラッパーは同期されているか = " + arrList2.IsSynchronized);
   }
}

実行結果

ArrayListの要素...
AB
CD
EF
GH
IJ
KL
ArrayListは同期されているか = False
同期ラッパーは同期されているか = True

ポイント解説

  • ArrayList.Synchronized(ArrayList list):指定したArrayListを内部に持つ、スレッドセーフな同期ラッパーを返す静的メソッドです。
  • IsSynchronizedプロパティ:そのコレクションへのアクセスが同期されている(スレッドセーフである)かどうかをbool値で返します。
  • 元のArrayListインスタンス自体が同期されるわけではなく、Synchronized()が返した新しいラッパー経由でのアクセスのみが同期されます。
  • foreachなどによる列挙処理を行う間は、ラッパーを使用していても自動的な排他制御は行われないため、必要に応じて明示的にコレクションをロック(lock構文やSyncRootの利用)してください。
  1. プロ級のメール署名を作る7つのコツ|印象を左右する完璧な署名の作り方

    ビジネスパーソンであれば、誰もがプロフェッショナルなメールの書き方を身につけておくべきです。キャリアアップのためだけでなく、日々のコミュニケーションを円滑にするためにも欠かせません。失礼な相手や怒った相手、さらには悪意ある相手への対応は簡単ではありませんが、自分が送るメールに誇りを持てること自体が、それだけで価値あることではないでしょうか。 当サイトでは「プロのようにメールを書く方法」についてこれまで多く取り上げてきましたが、意外と見落とされがちなのがメール署名(シグネチャ)です。署名を設定していない人は多く、設定していてもそのポテンシャルを活かしきれていないケースがほとんどです。さらに、メー

  2. すべての人に届くCockroachDB――マネージドサービスがついに一般提供(GA)へ

    2019年9月30日にObjectRocket.com/blogにて初公開 DBaaS(Database as a Service)の価値を理解していながらも、これまでCockroachDBのマネージドサービスは多くのユーザーにとって手の届かない存在でした。Rackspace ObjectRocketの「Managed CockroachDB」なら、約21ドル/GBという手頃な価格でCockroachDBのパワーを活用できます。24時間365日体制の専門チームによる完全なSLA(サービスレベル契約)が付帯し、エンタープライズレベルの機能をすべて備えています。 1年余り前、私たち