MENU

C#のSynchronizedCollection入門:スレッドセーフなコレクションの基本と活用法

C#でマルチスレッドプログラミングを行う際、データの整合性を保つことは重要な課題です。今回は、複数のスレッドから安全にアクセスできる「SynchronizedCollection<T>」について解説します。このコレクションは、並行処理環境でのデータ管理を簡単かつ安全に行うための重要なツールです。

目次

自己紹介

私は新卒でFAシステムの開発会社に入社した2年目エンジニアです。(2024年時点)

私はC#とVBを学習中なのでブログを見返す用のメモ代わりに活用しています。私の知識を共有し、皆様の学習のサポートとなれば幸いです。

SynchronizedCollection<T>とは

SynchronizedCollection<T>は、C#のSystem.Collections.Generic名前空間に含まれる、スレッドセーフなコレクションクラスです。主な特徴は以下の通りです:

  1. スレッドセーフ:複数のスレッドから同時にアクセスしても安全です。
  2. 内部的な同期:各操作が自動的に同期されます。
  3. 型安全性:ジェネリッククラスのため、特定の型のみを扱えます。

実際にSynchronizedCollection<T>を使用するコード例を見てみましょう:

using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;

class Program
{
    static void Main(string[] args)
    {
        // SynchronizedCollection<T>の作成
        SynchronizedCollection<int> syncNumbers = new SynchronizedCollection<int>();

        // 複数のスレッドから同時にアクセス
        Task task1 = Task.Run(() => AddNumbers(syncNumbers, 1, 5));
        Task task2 = Task.Run(() => AddNumbers(syncNumbers, 6, 10));

        Task.WaitAll(task1, task2);

        // コレクションの内容を表示
        Console.WriteLine("SynchronizedCollectionの内容:");
        foreach (int number in syncNumbers)
        {
            Console.WriteLine(number);
        }

        // 要素数の表示
        Console.WriteLine($"要素数: {syncNumbers.Count}");

        // 要素の存在確認
        int searchNumber = 5;
        if (syncNumbers.Contains(searchNumber))
        {
            Console.WriteLine($"{searchNumber}は含まれています。");
        }

        // 要素の削除
        syncNumbers.Remove(3);

        // 更新後のコレクションを表示
        Console.WriteLine("\n更新後のSynchronizedCollection:");
        foreach (int number in syncNumbers)
        {
            Console.WriteLine(number);
        }
    }

    static void AddNumbers(SynchronizedCollection<int> collection, int start, int end)
    {
        for (int i = start; i <= end; i++)
        {
            collection.Add(i);
            Thread.Sleep(100); // 処理の遅延をシミュレート
        }
    }
}

このコードでは、SynchronizedCollection<T>の基本的な操作を示しています:

  1. SynchronizedCollection<int>のインスタンスを作成します。
  2. 複数のタスク(スレッド)から同時にコレクションにアクセスします。
  3. foreachループで全要素を表示します。
  4. Countプロパティで要素数を取得します。
  5. Containsメソッドで要素の存在を確認します。
  6. Removeメソッドで要素を削除します。

SynchronizedCollection<T>の使用場面

SynchronizedCollection<T>は以下のような状況で特に有用です:

  • 複数のスレッドが同時にデータにアクセスする必要がある場合
  • スレッドセーフな操作が必要だが、パフォーマンスがそれほど重要でない場合
  • 簡単に実装できるスレッドセーフなコレクションが必要な場合

注意点

  1. すべての操作が同期されるため、高負荷な環境では性能が低下する可能性があります。
  2. 読み取り操作も同期されるため、読み取りが多い場合は他の選択肢を検討する必要があります。
  3. コレクション全体をロックするため、細粒度のロックが必要な場合には適していません。

まとめ

SynchronizedCollection<T>は、C#のマルチスレッドプログラミングにおいて、データの整合性を簡単に保つための有用なツールです。適切に使用することで、並行処理環境でのデータ管理を安全に行うことができます。

初心者の方々も、マルチスレッドプログラミングの基礎を学ぶ過程で、SynchronizedCollection<T>の概念を理解することは非常に有益です。実際にコードを書いて試すことで、その特性と使用方法をより深く理解できるでしょう。

その他のListに関する記事一覧

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次