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

C#でArrayListが同期されている(スレッドセーフ)かどうかを確認する方法

C#でArrayListが同期されている(スレッドセーフである)かどうかを確認するには、IsSynchronizedプロパティを使用します。このプロパティは、ArrayListへのアクセスが同期されている場合はtrue、同期されていない場合はfalseを返します。

なお、通常のArrayListは既定ではスレッドセーフではありません。マルチスレッド環境で安全に利用したい場合は、後述のArrayList.Synchronizedメソッドを使って同期ラッパーを作成する必要があります。

例1:通常のArrayListの場合

まず、同期されていない通常のArrayListでIsSynchronizedプロパティの値を確認してみましょう。

using System;
using System.Collections;
public class Demo {
   public static void Main(String[] args) {
      ArrayList list1 = new ArrayList();
      list1.Add("A");
      list1.Add("B");
      list1.Add("C");
      list1.Add("D");
      list1.Add("E");
      list1.Add("F");
      list1.Add("G");
      list1.Add("H");
      list1.Add("I");
      Console.WriteLine("Elements in ArrayList1...");
      foreach (string res in list1) {
         Console.WriteLine(res);
      }
      ArrayList list2 = new ArrayList();
      list2.Add("A");
      list2.Add("B");
      list2.Add("C");
      list2.Add("D");
      list2.Add("E");
      list2.Add("F");
      list2.Add("G");
      list2.Add("H");
      list2.Add("I");
      Console.WriteLine("Elements in ArrayList2...");
      foreach (string res in list2) {
         Console.WriteLine(res);
      }
      Console.WriteLine("Is ArrayList synchronized? = "+list2.IsSynchronized);
   }
}

出力結果

上記のコードを実行すると、次のような出力が得られます。

Elements in ArrayList1...
A
B
C
D
E
F
G
H
I
Elements in ArrayList2...
A
B
C
D
E
F
G
H
I
Is ArrayList synchronized? = False

このように、new演算子で生成した通常のArrayListに対しては、IsSynchronizedプロパティがFalseを返すことがわかります。

例2:ArrayList.Synchronizedメソッドで同期化した場合

続いて、ArrayList.Synchronizedメソッドを使って同期ラッパーを作成した場合の例を見てみましょう。

using System;
using System.Collections;
public class Demo {
   public static void Main(String[] args) {
      ArrayList list1 = new ArrayList();
      list1.Add("One");
      list1.Add("Two");
      list1.Add("Three");
      list1.Add("Four");
      list1.Add("Five");
      Console.WriteLine("Elements in ArrayList...");
      foreach (string res in list1) {
         Console.WriteLine(res);
      }
      ArrayList list = ArrayList.Synchronized(list1);
      Console.WriteLine("Is ArrayList synchronized? = "+list.IsSynchronized);
   }
}

出力結果

上記のコードを実行すると、次のような出力が得られます。

Elements in ArrayList...
One
Two
Three
Four
Five
Is ArrayList synchronized? = True

ArrayList.Synchronizedメソッドでラップされたリストに対しては、IsSynchronizedプロパティがTrueを返しています。

注意点

同期されたArrayListでも、列挙処理(foreachなど)中に他のスレッドがコレクションを変更すると、InvalidOperationExceptionが発生する可能性があります。スレッドセーフな列挙を行うには、列挙の間だけコレクションを明示的にロックすることをおすすめします。

  1. C#で現在のスレッドの状態(IsAlive)を確認する方法

    C#で現在実行中のスレッドの状態を確認するには、IsAlive プロパティを使用します。このプロパティは、スレッドが起動されており、まだ終了していない場合に True を返します。スレッド情報の取得まず、CurrentThread プロパティを使って、現在実行中のスレッドの情報を取得します。Thread thread = Thread.CurrentThread;次に、取得したスレッドオブジェクトに対して IsAlive プロパティを参照することで、スレッドの状態を確認できます。thread.IsAliveサンプルコード以下は、C#で現在のスレッドの状態を確認する完全なコード例です。スレッドに

  2. JavaのArrayList.clear()とremoveAll()の違いを徹底解説

    JavaのArrayListクラスは、Listインターフェースの可変長配列(リサイズ可能な配列)実装であり、null値の格納も許容しています。 このクラスには要素を削除するためのメソッドとしてclear()とremoveAll()が用意されています。どちらもリストから要素を取り除く点では共通していますが、動作内容には明確な違いがあります。本記事では、それぞれの使い方とサンプルコードを交えながら違いを解説します。 clear()メソッドとは clear()メソッドは、現在のListオブジェクトからすべての要素を一括で削除します。引数を受け取らず、呼び出すだけでリストが空の状態になります。 サンプ