書込みコレクションでのコピーはスレッドセーフティを提供し、実装シナリオはどのように役立ちますか?書込みコレクションのコピーはスレッドセーフティをどのように提供しますか?
答えて
CopyOnWriteArrayListと
CopyOnWriteArrayListとのインスタンスは、複数の同時読み取り可能リストの実装として動作し、そしてためには、書き込みと同時に発生すること読み出します。これを行う方法は、変更されるたびに新しいリストを作成することです。
- 読み取りはブロックされず、実質的に揮発性読み取りのコストのみを支払う。
- 書き込みは読み取りをブロックしません(またはその逆)。書き込みは1回だけ実行できます。
ConcurrentHashMap
とは異なり、リスト内の複数の要素を書き込みまたはアクセスする書き込み操作(addAll()
、retainAll()
など)はアトミックになります。
書き込み操作中、アレイは他の書き込みに対して完全にロックする必要があります。 (標準実装ではReentrantLockが使用されています)。これは、前述のように、複数の場所に影響を与える操作がアトミックである可能性があることを意味します。つまり、別のスレッドがsize()を呼び出している間に、あるスレッドがaddAll()で複数の項目をリストに追加すると、サイズを読み取るスレッドは、addAll()に追加された要素の数を反映するかどうかの値を取得します。中間値がに返される可能性はありません(もちろん、これらはリストにアクセスする唯一の2つのスレッドです!)。
CopyOnWriteArrayListとはreads hugely outnumber writes
例のために設計されています。
CopyOnWriteArraySet
別のクラス、CopyOnWriteArraySet
はCopyOnWriteArrayList
の上に構築されます。そのリストのカウンターパートと同様、このセットは、セットに含まれる要素数が少なく、読み込み数が大幅に多い場合に設計されています。
参考:それがこれを行うJava copy-on-write collections
この場合、ロック機構はどのように機能しますか?たとえば、スレッドがリストを反復して、リスト内の項目を読み取ると、リストオブジェクトのロックが取得され、ロックの取得中に、他のスレッドがそれをどのように読み取ることができますか?どのように読み取りはブロックされていませんか? – prvn
読み取りのためにロックを取得しません。ロックは、アレイ上で何らかの更新が行われている場合にのみ使用されます。 – YoungHobbit
[get()](http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/concurrent/CopyOnWriteArrayList.java#CopyOnWriteArrayList.get% 28int%29)メソッドは、[set()](http://grepcode.com/file/repository)としてロックを持たない。grepcode.com/java/root/jdk/openjdk/6-b14/java/util/concurrent/CopyOnWriteArrayList.java#CopyOnWriteArrayList.set%28int%2Cjava.lang.Object%29)最初にロックを取得して処理します。 – YoungHobbit
方法は、リストのブランドの新しいコピーにそれが変更されるたびにすることです。
読み取りはブロックされず、効果的に揮発性読み取りのコストのみを支払う。 書き込みは読み取りをブロックしません(またはその逆)。書き込みは1回だけ行うことができます。
- 1. Laravel Artisanはターミナルをブロックせずに組み込みサーバーをどのように提供しますか?
- 2. Azureはどのようにスケーリングを提供しますか?
- 3. Polymer Webアプリケーションはどのように提供しますか?
- 4. リストアからディレクトリリストをどのように提供しますか?
- 5. アドバイスメソッドにポイントカットバインドアノテーションをどのように提供しますか?
- 6. ionic2どのように/ @ Ina OpaqueTokenを提供しますか?
- 7. ファイルをどのように提供しますか?
- 8. index.jadeはどのように提供できますか?
- 9. javaは組み込みの静的String.Compareメソッドを提供していますか?
- 10. JSONをAngularでどのように提供できますか?
- 11. SAMLは実際にどのようにセキュリティを提供していますか?
- 12. プロセッサはどのようにしてデータをメモリカードに書き込みますか?
- 13. プレイブックからのファイルの役割をどのように提供しますか?
- 14. Facebookはアプリケーションにどのような機能を提供していますか?
- 15. Cassendraの書き込みはどのように機能しますか?
- 16. glibcの書き込みはどのように機能しますか?
- 17. どのようにしてデフォルトのデバッグ実装を提供しますか?
- 18. spidermonkey埋め込みでjs-ctypesを提供するにはどうすればよいですか?
- 19. スプリング統合jpa:outbound-channel-adapterは、書き込みに成功するためにフック/コールバックを提供しますか?
- 20. チームにGitHub管理、書き込み、または読み取りアクセスのチームを提供したい
- 21. ジェネリックのためにどのようにデフォルトタイプを提供しますか?
- 22. google-dataflowのテンプレートにランタイム入力をどのように提供しますか?
- 23. iTextSharpはどのように、書かれたテキストを隠して書き込み
- 24. NSMutableArrayをコピーしてマルチスレッドの書き込みでコピーしないようにします
- 25. couchbaseの同期ゲートウェイはどのようなフックを提供しますか?
- 26. AppengineサーブレットからGoogleクラウドストレージファイルをどのように提供しますか?
- 27. ローカルのDjango環境でメディアファイルをどのように提供しますか?
- 28. Dagger2にどのようにGoogleApiClient依存関係を提供しますか?
- 29. webpackにカスタムモジュール/ローダ解決ロジックをどのように提供しますか?
- 30. デーモンやサービスにどのように暗号化キーを提供しますか?
copy-on-writeは、1つのスレッド内でConcurrentModificationExceptionsを回避することもできます。 – Thilo
http://javamex.com/tutorials/synchronization_concurrency_8_copy_on_write.shtml – Thilo