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

C#でArrayListを同期する方法|SynchronizedメソッドとSyncRootの使い方

C#でArrayListを同期する方法

C#でArrayListをマルチスレッド環境下で安全に操作したい場合、ArrayList.Synchronizedメソッドを使用することで、スレッドセーフな(同期された)ラッパーを作成できます。

また、SyncRootプロパティを利用すれば、コレクション全体を明示的にロックすることも可能です。以下は、foreachループで要素を列挙する際にSyncRootでロックを行う基本的な例です。

ArrayList arr = new ArrayList();
lock(arr.SyncRoot) {
    foreach (object ele in arr) {
        // 要素に対する処理
    }
}

このようにlockステートメントと組み合わせることで、列挙中に他のスレッドからコレクションが変更されるのを防ぐことができます。

同期状態を確認するサンプルコード

次に、ArrayList.Synchronizedメソッドで作成したラッパーの同期状態を、IsSynchronizedプロパティで確認する完全なサンプルを見てみましょう。

using System;
using System.Collections;

public class Demo {
   public static void Main() {

      ArrayList arr1 = new ArrayList();
      arr1.Add("One");
      arr1.Add("Two");
      arr1.Add("Three");
      arr1.Add("Four");
      arr1.Add("Five");
      arr1.Add("Six");
      arr1.Add("Seven");
      arr1.Add("Eight");

      // ArrayListに同期ラッパーを設定
      ArrayList arr2 = ArrayList.Synchronized(arr1);

      // 最初のArrayListの同期状態を表示
      Console.WriteLine("arr1 = {0}", arr1.IsSynchronized ? "synchronized" : "not synchronized");

      // 2番目のArrayListの同期状態を表示
      Console.WriteLine("arr2 = {0}", arr2.IsSynchronized ? "synchronized" : "not synchronized");
   }
}

実行結果

arr1 = not synchronized
arr2 = synchronized

結果の解説

元のArrayListであるarr1は同期されていないため、「not synchronized」と表示されます。一方、ArrayList.Synchronizedメソッドで生成したarr2は同期ラッパーで包まれているため、「synchronized」と判定されます。

IsSynchronizedプロパティは、そのコレクションへのアクセスがスレッドセーフかどうかを示すbool値を返します。マルチスレッドアプリケーションでArrayListを複数のスレッド間で共有する場合は、Synchronizedメソッドによるラッパー化や、SyncRootプロパティを使った明示的なロックを活用すると安全です。

  1. C#でArrayListクラスを使うには?基本の使い方と主なプロパティを解説

    ArrayListクラスとはArrayListクラスは、個別にインデックスでアクセスできるオブジェクトの順序付きコレクションを表します。通常の配列と異なり、サイズが可変であるため、要素を自由に追加・削除できる点が大きな特徴です。そのため、配列の柔軟な代替手段として広く利用されてきました。ArrayListを使用するには、System.Collections名前空間をusingディレクティブで追加する必要があります。ArrayListクラスの主なプロパティ以下の表は、ArrayListクラスでよく使われる主なプロパティの一覧です。No.プロパティと説明1CapacityArrayListが格納で

  2. C#のArrayListとは?初期化・要素追加の基本をわかりやすく解説

    ArrayListとはArrayListは、サイズを動的に変更できるリスト構造を実装したコレクションです。C#における非ジェネリック型のコレクションであり、要素を追加するたびに内部の容量が自動的に拡張されるという特徴を持っています。ArrayListの初期化方法C#でArrayListを初期化するには、以下のように記述します。ArrayList arr = new ArrayList();要素の追加方法Addメソッドを使用すると、ArrayListの末尾に要素を追加できます。以下のコード例をご覧ください。ArrayList arr1 = new ArrayList(); arr1.Add(12