C#でArrayListの同期ラッパーを作成する方法
マルチスレッド環境でArrayListを安全に操作するには、同期(スレッドセーフ)ラッパーを作成する必要があります。C#では、静的メソッドArrayList.Synchronized()を使うことで、既存のArrayListをラップする同期ラッパーを簡単に取得できます。
まず、通常のArrayListがデフォルトでは同期されていないことを確認するサンプルコードを見てみましょう。
例1:通常のArrayListの同期状態を確認する
using System;
using System.Collections;
public class Demo {
public static void Main() {
ArrayList arrList = new ArrayList();
arrList.Add("AB");
arrList.Add("CD");
arrList.Add("EF");
arrList.Add("GH");
arrList.Add("IJ");
arrList.Add("KL");
Console.WriteLine("ArrayListの要素...");
foreach(string str in arrList) {
Console.WriteLine(str);
}
Console.WriteLine("ArrayListは同期されているか = " + arrList.IsSynchronized);
}
}
実行結果
ArrayListの要素... AB CD EF GH IJ KL ArrayListは同期されているか = False
このように、IsSynchronizedプロパティは「False」を返します。これは、通常のArrayListがスレッドセーフではないことを意味しています。
例2:ArrayList.Synchronized()で同期ラッパーを作成する
続いて、ArrayList.Synchronized()メソッドを使って同期ラッパーを作成する例を紹介します。
using System;
using System.Collections;
public class Demo {
public static void Main() {
ArrayList arrList = new ArrayList();
arrList.Add("AB");
arrList.Add("CD");
arrList.Add("EF");
arrList.Add("GH");
arrList.Add("IJ");
arrList.Add("KL");
Console.WriteLine("ArrayListの要素...");
foreach(string str in arrList) {
Console.WriteLine(str);
}
Console.WriteLine("ArrayListは同期されているか = " + arrList.IsSynchronized);
// 同期ラッパーを作成
ArrayList arrList2 = ArrayList.Synchronized(arrList);
Console.WriteLine("同期ラッパーは同期されているか = " + arrList2.IsSynchronized);
}
}
実行結果
ArrayListの要素... AB CD EF GH IJ KL ArrayListは同期されているか = False 同期ラッパーは同期されているか = True
ポイント解説
- ArrayList.Synchronized(ArrayList list):指定したArrayListを内部に持つ、スレッドセーフな同期ラッパーを返す静的メソッドです。
- IsSynchronizedプロパティ:そのコレクションへのアクセスが同期されている(スレッドセーフである)かどうかをbool値で返します。
- 元のArrayListインスタンス自体が同期されるわけではなく、Synchronized()が返した新しいラッパー経由でのアクセスのみが同期されます。
- foreachなどによる列挙処理を行う間は、ラッパーを使用していても自動的な排他制御は行われないため、必要に応じて明示的にコレクションをロック(lock構文やSyncRootの利用)してください。
-
プロ級のメール署名を作る7つのコツ|印象を左右する完璧な署名の作り方
ビジネスパーソンであれば、誰もがプロフェッショナルなメールの書き方を身につけておくべきです。キャリアアップのためだけでなく、日々のコミュニケーションを円滑にするためにも欠かせません。失礼な相手や怒った相手、さらには悪意ある相手への対応は簡単ではありませんが、自分が送るメールに誇りを持てること自体が、それだけで価値あることではないでしょうか。 当サイトでは「プロのようにメールを書く方法」についてこれまで多く取り上げてきましたが、意外と見落とされがちなのがメール署名(シグネチャ)です。署名を設定していない人は多く、設定していてもそのポテンシャルを活かしきれていないケースがほとんどです。さらに、メー
-
すべての人に届くCockroachDB――マネージドサービスがついに一般提供(GA)へ
2019年9月30日にObjectRocket.com/blogにて初公開 DBaaS(Database as a Service)の価値を理解していながらも、これまでCockroachDBのマネージドサービスは多くのユーザーにとって手の届かない存在でした。Rackspace ObjectRocketの「Managed CockroachDB」なら、約21ドル/GBという手頃な価格でCockroachDBのパワーを活用できます。24時間365日体制の専門チームによる完全なSLA(サービスレベル契約)が付帯し、エンタープライズレベルの機能をすべて備えています。 1年余り前、私たち