私は汎用のスレッドセーフなコレクションを持っていますが、Arraylistは静的な同期メソッドでスレッドセーフに簡単に使用できることがわかりましたが、このArrayListは汎用性がないため、それらをキャストする。これを行う簡単な方法はありますか?他のリストタイプも可能です。スレッドセーフなジェネリックarraylist?
1
A
答えて
3
少し知識は危険なことです;-)はい、あなたはメタナイトの提案を使用してSyncRoot
を使用することができますが、あなたは注意する必要がある - それは万能薬ではありません。マイクロソフトのBCLチームブログのthis postを参照して、SyncRoot
という単純な理由がわからない理由を確認してください。その記事からの引用:
私たちの一般的な コレクションのいくつかの抜け目のないユーザーは、我々はもはや が
ICollection<T>
と
にパブリック
SyncRoot
プロパティを提供することを認められていない私たちだと思います 人々がより多くのことをもっと重く考えるように強制する方が良い 同期、そして率直にaSyncRoot
一般的な コレクションのプロパティは値を提供しません。
もちろん、それはどのような状況でも使用できないというわけではありません。ユースケースを慎重に考え、自動操縦しないでください。
3
あなたは同期メソッドは、まだこれは言っているに関するMSDNで読む場合:。
「コレクションの列挙本質的にはスレッドセーフな処理ではないコレクションが同期されている場合でも、他のスレッドがまだコレクションを変更することができます列挙中にスレッドの安全性を保証するために、列挙全体でコレクションをロックするか、他のスレッドによって加えられた変更に起因する例外をキャッチすることができます。
3
List(T)ラッパーを作成し、SyncRootプロパティとのアクセスを同期させることができます。
MSDNの例:
ICollection ic = ...;
lock (ic.SyncRoot)
{
// Access the collection.
}
関連する問題
- 1. ジェネリックassertThat(ArrayListを、hasItems(InstanceOfSomeInterface))
- 2. ArrayListとインタフェース継承のジェネリック型の問題
- 3. ジェネリックにArraylistベースのバッグ/マルチセットを実装する
- 4. PHPスレッドセーフでWindows用でないスレッドセーフ
- 5. C#:スレッドセーフなイベント
- 6. スレッドセーフなリファクタリング
- 7. C++スレッドセーフなブラケットオペレータプロキシ
- 8. スレッドセーフなLparallel.queue?
- 9. スレッドセーフなnsdictionary
- 10. スレッドセーフなOutputStreamWriter
- 11. スレッドセーフな設定
- 12. スレッドセーフなC++スタック
- 13. スレッドセーフなキュー
- 14. スレッドセーフなForm.Show
- 15. スレッドセーフなソートコレクション
- 16. スレッドセーフなインクリメントC#
- 17. スレッドセーフなメモ化
- 18. スレッドセーフなログ
- 19. スレッドセーフなpthreadミューテックスロックラッパー
- 20. スレッドセーフな乱数
- 21. AsyncTasksとスレッドセーフなデータオブジェクト?
- 22. スレッドセーフな同期ブロック
- 23. スレッドセーフなコールバック関数
- 24. - スレッドセーフなコレクション修正
- 25. スレッドセーフなJavaのシングルトン
- 26. スレッドセーフなコルーチンとasio
- 27. スレッドセーフな方法は、
- 28. スレッドセーフなクラスとアクセッサ
- 29. JPAのスレッドセーフなエンティティ
- 30. スレッドセーフなシングルトンオブジェクト(objective-c?)?
はい、おそらく他のソリューションでもArrayListをラップできますか? :) –