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

C#でStackへの同期アクセスを取得する方法

C#の Stack コレクションに対してスレッドセーフな(同期された)アクセスを行うには、SyncRoot プロパティを利用して lock ステートメントでロックを取得します。これにより、複数のスレッドが同時にスタックへアクセスしても、データの整合性が保たれます。

サンプルコード1:数値を格納したStackの場合

using System;
using System.Collections;

public class Demo {
   public static void Main() {
      Stack stack = new Stack();
      stack.Push(100);
      stack.Push(200);
      stack.Push(300);
      stack.Push(400);
      stack.Push(500);

      Console.WriteLine("Stack...");
      foreach(Object ob in stack) {
         Console.WriteLine(ob);
      }

      Console.WriteLine("要素数 = " + stack.Count);

      Console.WriteLine("同期アクセス...");
      lock(stack.SyncRoot) {
         foreach(Object ob in stack) {
            Console.WriteLine(ob);
         }
      }
   }
}

出力結果

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

Stack...
500
400
300
200
100
要素数 = 5
同期アクセス...
500
400
300
200
100

サンプルコード2:文字列を格納したStackの場合

続いて、文字列を要素として持つスタックでの同期アクセスの例を見てみましょう。

using System;
using System.Collections;

public class Demo {
   public static void Main() {
      Stack stack = new Stack();
      stack.Push("Jacob");
      stack.Push("Tim");
      stack.Push("Philips");
      stack.Push("Tom");
      stack.Push("Amy");
      stack.Push("Katie");
      stack.Push("Selena");
      stack.Push("Taylor");
      stack.Push("Justin");

      Console.WriteLine("Stack...");
      foreach(Object ob in stack) {
         Console.WriteLine(ob);
      }

      Console.WriteLine("\n同期アクセス...");
      lock(stack.SyncRoot) {
         foreach(Object ob in stack) {
            Console.WriteLine(ob);
         }
      }
   }
}

出力結果

このコードを実行すると、以下の出力が得られます。

Stack...
Justin
Taylor
Selena
Katie
Amy
Tom
Philips
Tim
Jacob

同期アクセス...
Justin
Taylor
Selena
Katie
Amy
Tom
Philips
Tim
Jacob

ポイント解説

  • SyncRootプロパティ: コレクションへのアクセスを同期するために使用されるオブジェクトを返します。
  • lockステートメント: 指定したオブジェクトの排他ロックを取得し、ブロック内の処理が終わるまで他のスレッドからのアクセスを防ぎます。
  • 注意点: 列挙(foreach)中に他のスレッドがコレクションを変更すると例外が発生するため、列挙操作は必ずロック内で行うのが安全です。
  1. C#のStackクラスとは?使い方と基本操作をわかりやすく解説

    C#のStackクラスは、要素を「後入れ先出し(LIFO:Last-In, First-Out)」の形式で管理するためのコレクションです。最後に追加した要素が最初に取り出されるという特性を持つため、履歴管理や元に戻す(Undo)処理など、特定の順序でデータを扱いたい場面で活用されます。 Stackの基本操作:Push と Pop Stackでは、要素を追加することを「プッシュ(Push)」、要素を取り出すことを「ポップ(Pop)」と呼びます。 Push:スタックの一番上に新しい要素を追加する Pop:スタックの一番上から要素を取り出して削除する Stackクラスの使用例 まず、Stackに

  2. macOSのDockから「最近使った項目」にすばやくアクセスする方法

    以前作業していたファイルにすぐアクセスできれば、中断した仕事を素早く再開できます。昨日誰かから送られてきたPDFの続きを読みたい、昨晩途中まで読んでいた記事を読み終えたい——そんな場面は多いのではないでしょうか。 しかし、これらのファイルをデスクトップに置いていない限り、数クリックでアクセスするのは簡単ではありません。かといって、すべてのファイルをデスクトップに置くと、スペースには限りがあり、長くは続きません。 こうした制約にお困りなら、MacのDockに隠された機能が役立ちます。この機能を使えば、最近使った項目をDockに追加でき、ワンクリックですぐに開けるようになります。 Doc