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

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

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

通常のHashtableインスタンスはデフォルトでは同期されていません。スレッドセーフなラッパーを作成したい場合は、静的メソッドHashtable.Synchronized()を使用します。

例1:Synchronized()メソッドで同期ラッパーを作成する

以下のコードでは、まず通常のHashtableを作成し、その後Hashtable.Synchronized()を使って同期されたラッパーを生成しています。

using System;
using System.Collections;
public class Demo {
   public static void Main() {
      Hashtable hash = new Hashtable();
      hash.Add("One", "Katie");
      hash.Add("Two", "John");
      hash.Add("Three", "Barry");
      hash.Add("Four", "");
      hash.Add("Five","Harry");
      hash.Add("Six", "F");
      hash.Add("Seven", "Tom");
      hash.Add("Eight","Andy");
      hash.Add("Nine", "I");
      hash.Add("Ten", "Tim");
      Console.WriteLine("Hashtable Key and Value pairs...");
      foreach(DictionaryEntry entry in hash) {
         Console.WriteLine("{0} and {1} ", entry.Key, entry.Value);
      }
      Console.WriteLine("Is the Hashtable having fixed size? = "+hash.IsFixedSize);
      Console.WriteLine("If Hashtable read-only? = "+hash.IsReadOnly);
      Hashtable hash2 = Hashtable.Synchronized(hash);
      Console.WriteLine("Is Hash synchronized = "+hash2.IsSynchronized);
   }
}

出力結果

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

Hashtable Key and Value pairs...
One and Katie
Ten and Tim
Five and Harry
Three and Barry
Seven and Tom
Two and John
Four and  
Eight and Andy
Nine and I
Six and F
Is the Hashtable having fixed size? = False
If Hashtable read-only? = False
Is Hash synchronized = True

このように、Hashtable.Synchronized(hash)で作成したラッパーに対してIsSynchronizedを確認するとTrueが返され、同期されていることがわかります。

例2:同期されていない通常のHashtableの場合

続いて、同期処理を行っていない通常のHashtableの場合を見てみましょう。

using System;
using System.Collections;
public class Demo {
   public static void Main() {
      Hashtable hash = new Hashtable();
      hash.Add("One", 1);
      hash.Add("Two", 2);
      hash.Add("Three", 2);
      hash.Add("Four", 4);
      hash.Add("Five",5);
      hash.Add("Six", 6);
      hash.Add("Seven", 7);
      Console.WriteLine("Hashtable Key and Value pairs...");
      foreach(DictionaryEntry entry in hash) {
         Console.WriteLine("{0} and {1} ", entry.Key, entry.Value);
      }
      Console.WriteLine("Is the Hashtable having fixed size? = "+hash.IsFixedSize);
      Console.WriteLine("If Hashtable read-only? = "+hash.IsReadOnly);
      Console.WriteLine("Is Hash synchronized = "+hash.IsSynchronized);
   }
}

出力結果

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

Hashtable Key and Value pairs...
One and 1
Five and 5
Three and 2
Seven and 7
Two and 2
Four and 4
Six and 6
Is the Hashtable having fixed size? = False
If Hashtable read-only? = False
Is Hash synchronized = False

この例では、同期ラッパーを作成していないため、IsSynchronizedFalseを返します。

ポイントまとめ

  • IsSynchronizedプロパティ:Hashtableへのアクセスが同期されているかどうかを示すbool値を返します。
  • Hashtable.Synchronized():元のHashtableをラップしたスレッドセーフな同期ラッパーを返します。
  • IsFixedSize:Hashtableが固定サイズかどうかを判定します。
  • IsReadOnly:Hashtableが読み取り専用かどうかを判定します。

マルチスレッド環境でHashtableを安全に操作したい場合は、必ずSynchronized()メソッドでラップし、IsSynchronizedで同期状態を確認することをおすすめします。

  1. C#でハッシュテーブルをクリアする方法:Clear()メソッドの使い方を解説

    C#では、Clear()メソッドを使うことで、ハッシュテーブル(Hashtable)に格納されたすべてのキーと値のペアを一括で削除できます。この記事では、実際のコード例を交えながら、Clear()メソッドの基本的な使い方を解説します。 サンプルとなるハッシュテーブル まず、以下のようなハッシュテーブルを用意します。 Hashtable h = new Hashtable(); h.Add(1, Amit); h.Add(2, Sachin); h.Add(3, Rahul); Clear()メソッドでハッシュテーブルをクリアする ハッシュテーブルを空にするには、Clear()メソッドを呼び

  2. C#におけるHashtableとDictionaryの違いとは?特徴と使い分けを徹底解説

    C#には、キーと値のペアでデータを管理するコレクションとして「Hashtable」と「Dictionary」が用意されています。どちらもキーを使って要素へアクセスできる点は共通していますが、パフォーマンスや型安全性などに重要な違いがあります。本記事では、それぞれの特徴と使い分けのポイントをわかりやすく解説します。 Hashtable(ハッシュテーブル)とは Hashtableは、キーを使用して要素にアクセスしたい場合や、有用なキー値を識別できる場合に利用されるコレクションです。Hashtable内の各項目はキーと値のペア(key/value pair)で構成されており、このキーを通じてコレクシ