|
.NET TIPS スレッド・セーフなコレクション・オブジェクトを作成するには?デジタルアドバンテージ 遠藤 孝信2005/03/04 |
![]() |
|
|
|
.NET Frameworkのクラス・ライブラリには、リストやスタック、キューといった基本的なコレクション・クラスが用意されているが、これらはすべてスレッド・セーフではない。つまり1つのコレクション・オブジェクト(以下、コレクションと略)に対して、複数のスレッドから同時に操作する場合と、それらすべての操作を順に1つずつ行う場合とでは、異なる処理結果を生み出す可能性があるということだ。
このような状況を避けるためには、コレクションを操作する前にそのコレクションをロックすればよいが(具体的にはSyncRootプロパティを利用する)、コレクション・クラスのSynchronizedメソッドを利用すればスレッド・セーフなコレクションを作成することができる。Synchronizedメソッドを持つコレクション・クラス(System.Collections名前空間のクラス)には、次のようなクラスがある。
| ・ArrayListクラス | ・Hashtableクラス | ・Queueクラス |
| ・SortedListクラス | ・Stackクラス |
例えば、ArrayListオブジェクトの場合には、次のようにしてスレッド・セーフなコレクションを得ることができる。
ArrayList dangerousList = new ArrayList();
ArrayList safeList = ArrayList.Synchronized(dangerousList);
この場合には、safeListオブジェクトに対するすべてのメソッドの呼び出しは同期を取りながら実行されるため、そのオブジェクトのロックは不要となる。
Synchronizedメソッドにより作成されるラッパー・オブジェクト
Synchronizedメソッドが返すオブジェクトは、実際には各コレクション・クラスを継承したクラスのオブジェクトであり、そのクラスはコレクション・クラスのラッパー・クラスとなる。
例えばArrayListクラスの場合には、そのラッパー・クラスの名前は実際にはSyncArrayListクラスであり、そのAddクラスは次のような実装となっている。
|
|
| ArrayListクラスに対するスレッド・セーフなラッパー・クラスのAddメソッド(C#) | |
| このクラスはArrayListクラスのprivateな入れ子クラスとなっており、Synchronizedメソッド経由でしかインスタンス化できない。 |
このクラスでは、ArrayListクラスのすべてのメソッドやプロパティをオーバーライドしている。すべてのメソッドやプロパティは、このAddメソッドのように同期のためのオブジェクト(上記の例ではobjectForLock)をロックしてから、ラップしているArrayListオブジェクトを操作するようになっているため、それを呼び出す側でのロックが不要となるわけだ。
なお、コレクションがスレッド・セーフかどうか(Synchronizedメソッドにより作成されたかどうか)は、そのオブジェクトのIsSynchronizedプロパティによりチェックできる。![]()
| カテゴリ:クラス・ライブラリ 処理対象:コレクション カテゴリ:クラス・ライブラリ 処理対象:マルチスレッド 使用ライブラリ:ArrayListクラス(System.Collections名前空間) 使用ライブラリ:Hashtableクラス(System.Collections名前空間) 使用ライブラリ:Queueクラス(System.Collections名前空間) 使用ライブラリ:SortedListクラス(System.Collections名前空間) 使用ライブラリ:Stackクラス(System.Collections名前空間) |
|
||||||||||||
| 「.NET TIPS」 |
TechTargetジャパン
- 新人プログラマーのためのInsider.NETの歩き方 2012 (2012/5/22)
晴れて.NETプログラマーとなる新人が効率的に開発技術を習得するには? 大量にある記事群の中から新人が読むべきお勧めを厳選して紹介 - jQuery MobileでJavaScriptプログラミング (2012/5/17)
jQuery Mobileは手軽なだけでなく、JavaScriptのAPIも充実しており、独自機能の実装もできる。今回は「グローバル設定」と「イベント」を解説 - Windows上で開発するための開発環境構築入門 (2012/5/16)
Windowsを使ってチームで開発している? なのにサーバOSを設定・運用した経験がない? そうなら、今すぐ学ぼう - 「コントラクト」でアプリのサンドボックスを乗り越える! (2012/5/11)
Metroスタイル・アプリはサンドボックスの中で動作する。それを乗り越えてほかのアプリと連携する仕組み「コントラクト」を解説
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -


