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

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

C#のStack.IsSynchronizedプロパティは、Stackへのアクセスが同期されている(スレッドセーフである)かどうかを示す値を取得するために使用されるプロパティです。マルチスレッド環境でコレクションを扱う際に、対象のStackがスレッドセーフかどうかを確認するのに役立ちます。

構文

IsSynchronizedプロパティの構文は以下の通りです。

public virtual bool IsSynchronized { get; }

このプロパティは読み取り専用で、Stackが同期されていれば true、同期されていなければ false を返します。通常のStackインスタンスは同期されていないため、多くの場合 false が返されます。

サンプルコード1:文字列のStackでIsSynchronizedを確認する

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

using System;
using System.Collections;
public class Demo {
    public static void Main() {
        Stack stack = new Stack();
        stack.Push("Inspiron");
        stack.Push("Alienware");
        stack.Push("Projectors");
        stack.Push("Monitors");
        stack.Push("XPS");
        stack.Push("Laptop");
        stack.Push("Notebook");
        Console.WriteLine("Stack elements...");
        foreach(string val in stack) {
            Console.WriteLine(val);
        }
        Console.WriteLine("Count of elements = "+stack.Count);
        Console.WriteLine("Element Speakers is the stack? = "+stack.Contains("Speakers"));
        stack.Push("Headphone");
        stack.Push("Keyboard");
        stack.Push("Earphone");
        Console.WriteLine("\nStack elements...updated");
        foreach(string val in stack) {
            Console.WriteLine(val);
        }
        Console.WriteLine("Count of elements (updated) = "+stack.Count);
        Console.WriteLine("\nElement Alienware is the stack? = "+stack.Contains("Alienware"));
        Console.WriteLine("Is the Stack synchronized? = "+stack.IsSynchronized);
        Stack stack2 = (Stack)stack.Clone();
        Console.WriteLine("\nStack elements...cloned");
        IEnumerator demoEnum = stack2.GetEnumerator();
        while (demoEnum.MoveNext()) {
            Console.WriteLine(demoEnum.Current);
        }
        Console.WriteLine("Count of elements (updated) = "+stack.Count);
    }
}

出力結果

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

Stack elements...
Notebook
Laptop
XPS
Monitors
Projectors
Alienware
Inspiron
Count of elements = 7
Element Speakers is the stack? = False
Stack elements...updated
Earphone
Keyboard
Headphone
Notebook
Laptop
XPS
Monitors
Projectors
Alienware
Inspiron
Count of elements (updated) = 10
Element Alienware is the stack? = True
Is the Stack synchronized? = False
Stack elements...cloned
Earphone
Keyboard
Headphone
Notebook
Laptop
XPS
Monitors
Projectors
Alienware
Inspiron
Count of elements (updated) = 10

この例では、通常の方法で生成したStackに対してIsSynchronizedプロパティを参照しているため、false が出力されています。つまり、このStackはスレッドセーフではないことを意味します。

サンプルコード2:Stack.Synchronizedメソッドとの組み合わせ

次に、数値を格納したStackを使い、Stack.Synchronizedメソッドでラップした場合の挙動も確認してみましょう。

using System;
using System.Collections;
public class Demo {
    public static void Main() {
        Stack stack = new Stack();
        stack.Push(150);
        stack.Push(300);
        stack.Push(500);
        stack.Push(750);
        stack.Push(1000);
        stack.Push(1250);
        stack.Push(1500);
        stack.Push(2000);
        stack.Push(2500);
        Console.WriteLine("Stack elements...");
        foreach(int val in stack) {
            Console.WriteLine(val);
        }
        Console.WriteLine("Count of elements = "+stack.Count);
        Console.WriteLine("Element 750 is the stack? = "+stack.Contains(750));
        stack.Push(3000);
        Console.WriteLine("\nStack elements...updated");
        foreach(int val in stack) {
            Console.WriteLine(val);
        }
        Console.WriteLine("Count of elements (updated) = "+stack.Count);
        Console.WriteLine("Element 5000 is the stack? = "+stack.Contains(5000));
        Stack stack2 = (Stack)stack.Clone();
        Console.WriteLine("\nStack elements...cloned");
        foreach(int val in stack2) {
            Console.WriteLine(val);
        }
        Console.Write("Count of elements (updated) = "+stack2.Count);
        Console.WriteLine("Is the Stack synchronized? = "+stack.IsSynchronized);
        Stack stack3 = Stack.Synchronized(stack);
        Console.WriteLine("Is the Stack synchronized? = "+stack3.IsSynchronized);
    }
}

出力結果

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

Stack elements...
2500
2000
1500
1250
1000
750
500
300
150
Count of elements = 9
Element 750 is the stack? = True
Stack elements...updated
3000
2500
2000
1500
1250
1000
750
500
300
150
Count of elements (updated) = 10
Element 5000 is the stack? = False
Stack elements...cloned
3000
2500
2000
1500
1250
1000
750
500
300
150
Count of elements (updated) = 10Is the Stack synchronized? = False
Is the Stack synchronized? = True

注目すべき点は最後の2行の出力です。元のStackに対するIsSynchronizedプロパティは false を返しますが、Stack.Synchronized(stack) メソッドでラップして作成した新しいStack(stack3)に対しては true が返されています。

まとめ

  • IsSynchronizedプロパティは、Stackがスレッドセーフかどうかを示すbool値を返します。
  • 通常のStackインスタンスは同期されていないため、falseを返します。
  • スレッドセーフなStackが必要な場合は、Stack.Synchronizedメソッドを使用してラップします。
  • マルチスレッド環境でコレクションを共有する場合は、必ず同期状態を確認することが重要です。
  1. 【C#】Console.KeyAvailableプロパティの使い方とサンプルコード

    Console.KeyAvailableプロパティとはC#のConsole.KeyAvailableプロパティは、標準入力ストリームにキー入力が利用可能かどうかを示す値を取得するためのプロパティです。戻り値はbool型で、キー入力があればtrue、なければfalseを返します。このプロパティは読み取り専用(getのみ)であり、Console.ReadKey()メソッドと組み合わせることで、処理をブロックすることなくキー入力の有無を確認しながらループ処理を実装できます。構文public static bool KeyAvailable { get; }使用例1:キー入力を検出して表示する以下は、

  2. C#のConsoleクラスとは?主要プロパティの使い方を実例付きで解説

    C#のConsoleクラスは、コンソールアプリケーションにおける標準入力・標準出力・標準エラー出力の各ストリームを表すクラスです。テキストの表示や入力の読み取りだけでなく、文字色や背景色の変更、カーソル位置やサイズの制御など、コンソール操作に関するさまざまな機能が提供されています。ここでは、Consoleクラスの代表的なプロパティの使い方を、サンプルコードと実行結果とあわせて解説します。Console.CursorLeftプロパティコンソール上のカーソル位置(左端から数えた列位置)を変更するには、Console.CursorLeftプロパティを使用します。サンプルコードusing System