0

高度な Java コレクション API には、CopyOnWriteArrayList と ConcurrentHashMap があります。しかし、これらのデータ構造の根底にある原則は異なります。つまり、ConcurrentHashMap は、書き込み操作が行われている Map のセグメントのみをロックします。これにより、パフォーマンスに影響を与えずに同期の問題を回避できます。

一方、CopyOnWriteArrayList は、元の List の複製を作成することにより、同時実行の問題を防ぎます。なぜこれらの実装は非常に異なるのでしょうか? Java は、どちらがより適切に機能するかを確認するためのテストにすぎませんか?

4

1 に答える 1

0

並行データ構造は、データ構造に対する個々の操作のシーケンスが常にそれ自体の観点から一貫した状態になるように設計されていますが、データ構造を少しずつ読み取ることによって形成される「スナップショット」は、データ構造がこれまで保持していた状態を必ずしも表すとは限りません。たとえば、ユーザーのコレクションを読み上げているときに、「Zachary」の名前が「Adam」に変更された場合、名前が変更されたユーザーは、「Adam」、「Zachary」、またはその両方として読み上げられるか、どちらも読み上げられない可能性があります。列挙中にコレクションが、ユーザーが両方の名前で存在したことがない、またはどちらの名前でも存在しなかったという状態にならなかったとしても、列挙によってそのように見える可能性があります。

コピー オン ライト コレクションは、コレクション全体の状態のスナップショットを取得できるように設計されており、コレクションが実際にその状態にある瞬間があったことを保証します。スナップショット リクエストを含むすべてのアクションの結果は、リクエストが発行されてから完了したと報告されるまでの特定の時点で実行された各アクションと一致する必要があります。いずれかが完了する前に 2 つの要求が与えられた場合、どちらのアクションが先行するかの選択は任意ですが、グローバルに一貫した順序が必要です。

于 2013-10-04T17:40:36.390 に答える