C#でマルチスレッドプログラミングを行う際、データの整合性を保つことは重要な課題です。今回は、複数のスレッドから安全にアクセスできる「SynchronizedCollection<T>」について解説します。このコレクションは、並行処理環境でのデータ管理を簡単かつ安全に行うための重要なツールです。
目次
自己紹介
私は新卒でFAシステムの開発会社に入社した2年目エンジニアです。(2024年時点)
私はC#とVBを学習中なのでブログを見返す用のメモ代わりに活用しています。私の知識を共有し、皆様の学習のサポートとなれば幸いです。
SynchronizedCollection<T>とは
SynchronizedCollection<T>は、C#のSystem.Collections.Generic
名前空間に含まれる、スレッドセーフなコレクションクラスです。主な特徴は以下の通りです:
- スレッドセーフ:複数のスレッドから同時にアクセスしても安全です。
- 内部的な同期:各操作が自動的に同期されます。
- 型安全性:ジェネリッククラスのため、特定の型のみを扱えます。
実際に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>の基本的な操作を示しています:
SynchronizedCollection<int>
のインスタンスを作成します。- 複数のタスク(スレッド)から同時にコレクションにアクセスします。
foreach
ループで全要素を表示します。Count
プロパティで要素数を取得します。Contains
メソッドで要素の存在を確認します。Remove
メソッドで要素を削除します。
SynchronizedCollection<T>の使用場面
SynchronizedCollection<T>は以下のような状況で特に有用です:
- 複数のスレッドが同時にデータにアクセスする必要がある場合
- スレッドセーフな操作が必要だが、パフォーマンスがそれほど重要でない場合
- 簡単に実装できるスレッドセーフなコレクションが必要な場合
注意点
- すべての操作が同期されるため、高負荷な環境では性能が低下する可能性があります。
- 読み取り操作も同期されるため、読み取りが多い場合は他の選択肢を検討する必要があります。
- コレクション全体をロックするため、細粒度のロックが必要な場合には適していません。
まとめ
SynchronizedCollection<T>は、C#のマルチスレッドプログラミングにおいて、データの整合性を簡単に保つための有用なツールです。適切に使用することで、並行処理環境でのデータ管理を安全に行うことができます。
初心者の方々も、マルチスレッドプログラミングの基礎を学ぶ過程で、SynchronizedCollection<T>の概念を理解することは非常に有益です。実際にコードを書いて試すことで、その特性と使用方法をより深く理解できるでしょう。
その他のListに関する記事一覧
-
C# List
【C#入門】Listの要素を検索する方法と実践例
-
C# List
【C#入門】Listに要素を追加する方法とAdd()メソッドの使い方
-
C# List
【C#入門】Listのソート方法と実践的な使用例
-
C# List
【C#入門】Listの初期化方法と基本的な使い方
-
C# List
【C#入門】Listの使い方について|要素の追加・削除・ソート・検索
-
C# List
C#のSynchronizedCollection
入門:スレッドセーフなコレクションの基本と活用法 -
C# List
C#のStack
入門:後入れ先出しデータ構造の基本と活用法 -
C# List
C#のQueue入門:先入れ先出しデータ構造の基本と活用法
-
C# List
C#のHashSet入門:効率的な重複なしコレクションの使い方
-
C# List
C#のList
(Concurrent Collections)入門:並行処理のための安全なデータ構造 -
C# List
C#のImmutableList入門:不変性がもたらす安全なプログラミング
-
C# List
C#のSortedList入門:自動整列するデータ構造の魅力
コメント