C#で配列への同期アクセスを実現する方法(SyncRootプロパティの使い方)
C#でマルチスレッド環境下において配列へ安全にアクセスしたい場合、SyncRootプロパティを利用してロックを取得することで、同期アクセスを実現できます。ArrayクラスのSyncRootプロパティは、配列へのアクセスを同期させるためのオブジェクトを返します。
基本的な仕組み
lockステートメントの引数にintArr.SyncRootのように指定することで、その配列に対する排他制御が可能になります。これにより、複数のスレッドが同時に同じ配列へアクセスしても、データの整合性が保たれます。
サンプルコード1:整数型配列の場合
using System;
public class Demo {
public static void Main() {
Array intArr = new int[] {5, 10, 15, 20, 25, 30, 35, 40 };
Console.WriteLine("整数型配列...");
foreach (int i in intArr)
Console.WriteLine(i);
Console.WriteLine("配列にロックを適用した後...");
lock(intArr.SyncRoot) {
foreach (Object ob in intArr)
Console.WriteLine(ob);
}
}
}実行結果
上記のコードを実行すると、次のような出力が得られます。
整数型配列... 5 10 15 20 25 30 35 40 配列にロックを適用した後... 5 10 15 20 25 30 35 40
サンプルコード2:文字列型配列の場合
続いて、文字列型の配列で同様の処理を行う例を見てみましょう。
using System;
public class Demo {
public static void Main() {
Array strArr = new String[] {"Harry", "Tom", "Kevin", "Ryan", "Katie", "Amy" };
Console.WriteLine("文字列型配列...");
foreach (string i in strArr)
Console.WriteLine(i);
Console.WriteLine("配列にロックを適用した後...");
lock(strArr.SyncRoot) {
foreach (Object ob in strArr)
Console.WriteLine(ob);
}
}
}実行結果
このコードも同様に、以下の出力を生成します。
文字列型配列... Harry Tom Kevin Ryan Katie Amy 配列にロックを適用した後... Harry Tom Kevin Ryan Katie Amy
ポイントまとめ
- SyncRootプロパティは、コレクションへのアクセスを同期するためのオブジェクトを取得します。
- lockステートメントと組み合わせることで、複数スレッドからの同時アクセスによる競合状態を防げます。
- 整数型・文字列型など、要素の型に関わらず同じ手法で同期アクセスが可能です。
- なお、通常の配列ではIsSynchronizedプロパティがfalseを返すため、明示的にSyncRootを使ったロック処理が必要になります。
-
ノートPCで4G・3G回線を使ってインターネットに接続する方法
押さえておきたいポイントノートPCに3Gまたは4Gカード(チップセット)が内蔵されている場合は、モバイルブロードバンド契約をするだけで利用できます。外付けの4G/3G USBモデム(ラップトップスティック)を挿すか、モバイルWi-Fiルーターにワイヤレス接続しましょう。スマートフォンにテザリングアプリを導入すれば、スマホのモバイルデータをノートPCで共有できます。この記事では、OSを問わず、あらゆるノートパソコンで4Gまたは3Gのインターネット接続を利用する方法を解説します。内蔵型4G/3Gモバイルブロードバンド最近のノートパソコン、ネットブック、タブレットの多くは、購入時に3Gや4G対応カー
-
C#で配列を宣言する方法とは?基本構文とサンプルコードを解説
C#で配列を宣言するには、次の構文を使用します。 datatype[ ] 配列名; それぞれの構成要素の意味は以下のとおりです。 datatype … 配列に格納する要素のデータ型を指定します。 [ ] … この変数が配列であることを示します。 配列名 … 配列につける名前を指定します。 たとえば、double型の配列「balance」を宣言する場合は次のように書きます。 double[ ] balance; なお、この段階では配列の実体(メモリ領域)はまだ確保されていません。実際に要素を格納するには、new演算子を使って配列をインスタンス化し、要素数を指定する必要があります。 続いて、