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

C#のQueue.IsSynchronizedプロパティとは?使い方とサンプルコードを解説

C#のQueue.IsSynchronizedプロパティは、Queueへのアクセスが同期されている(スレッドセーフである)かどうかを示すbool型の値を取得するために使用されます。

非ジェネリックなQueueクラスは、既定ではスレッドセーフではありません。そのため、複数のスレッドから同時に同じキューへアクセスする可能性がある場合は、このプロパティで同期状態を確認することが重要です。同期が必要な場合は、Queue.Synchronizedメソッドで同期ラッパーを作成できます。

構文

構文は以下のとおりです。

public virtual bool IsSynchronized { get; }

戻り値

Queueへのアクセスが同期されている(スレッドセーフである)場合は true、そうでない場合は false を返します。

例1:通常のQueueの場合

まず、基本的な使用例を見てみましょう。

using System;
using System.Collections;

public class Demo {
    public static void Main() {
        Queue queue = new Queue();
        queue.Enqueue(100);
        queue.Enqueue(200);
        queue.Enqueue(300);
        queue.Enqueue(400);
        queue.Enqueue(500);
        queue.Enqueue(600);
        queue.Enqueue(700);
        queue.Enqueue(800);
        queue.Enqueue(900);
        queue.Enqueue(1000);

        Console.WriteLine("Queue...");
        IEnumerator demoEnum = queue.GetEnumerator();
        while (demoEnum.MoveNext()) {
            Console.WriteLine(demoEnum.Current);
        }

        Console.WriteLine("Is Queue synchronized? = " + queue.IsSynchronized);
    }
}

出力

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

Queue...
100
200
300
400
500
600
700
800
900
1000
Is Queue synchronized? = False

通常のQueueインスタンスに対しては False が返されることが確認できます。

例2:Queue.Synchronizedで同期ラッパーを作成した場合

次に、Queue.Synchronizedメソッドを使って同期ラッパーを作成した場合の挙動を確認してみましょう。

using System;
using System.Collections;

public class Demo {
    public static void Main() {
        Queue queue = new Queue();
        queue.Enqueue("AB");
        queue.Enqueue("BC");
        queue.Enqueue("CD");
        queue.Enqueue("DE");
        queue.Enqueue("EF");
        queue.Enqueue("FG");
        queue.Enqueue("GH");
        queue.Enqueue("HI");

        Console.WriteLine("Queue...");
        IEnumerator demoEnum = queue.GetEnumerator();
        while (demoEnum.MoveNext()) {
            Console.WriteLine(demoEnum.Current);
        }

        Console.WriteLine("Is Queue synchronized? = " + queue.IsSynchronized);

        Queue queue2 = Queue.Synchronized(queue);
        Console.WriteLine("Is Queue synchronized now? = " + queue2.IsSynchronized);
    }
}

出力

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

Queue...
AB
BC
CD
DE
EF
FG
GH
HI
Is Queue synchronized? = False
Is Queue synchronized now? = True

元のqueueオブジェクトは False を返しますが、Queue.Synchronizedメソッドで作成した同期ラッパー(queue2)に対しては True が返されることがわかります。マルチスレッド環境で非ジェネリックなQueueを安全に扱いたい場合は、必ず同期ラッパー経由でアクセスするようにしましょう。

  1. C#のQueueクラスにおけるCountプロパティの使い方を解説

    C#のQueueクラスには、キューに格納されている要素の数を取得するためのCountプロパティが用意されています。Countプロパティは読み取り専用で、現在キューに含まれる要素数をint型の値として返します。 Queueへの要素の追加方法 Queueに要素を追加するには、Enqueueメソッドを使用します。以下のようにインスタンスを作成し、要素を順番に追加していきます。 Queue q = new Queue(); q.Enqueue(1); q.Enqueue(2); q.Enqueue(3); q.Enqueue(4); Countプロパティで要素数を取得する 要素を追加した後、C

  2. Pythonでキュー(Queue)を実装するプログラムの書き方

    Pythonでキュー(Queue)を実装するには、専用のクラスを作成し、要素を追加・削除するためのメソッドを定義します。その後、クラスのインスタンスを生成し、メソッドを呼び出すことで各種操作を行い、結果をコンソールに表示します。キューは「先入れ先出し(FIFO:First In First Out)」と呼ばれるデータ構造で、最初に追加した要素が最初に取り出されるという特徴があります。タスク管理やバッファ処理など、さまざまな場面で活用される基本的な構造です。以下に、Pythonでのキューの実装例を示します。サンプルコードclass Queue_struct:   &