次の引用の最後の部分がよくわかりません。
通常、取得操作 (get を含む) はブロックされないため、更新操作 (put および remove を含む) と重複する場合があります。検索は、開始時に保持されている最新の更新操作の結果を反映します。putAll や clear などの集計操作の場合、同時取得では、一部のエントリのみの挿入または削除が反映される場合があります。
なぜ一部のエントリだけなのですか?
次の引用の最後の部分がよくわかりません。
通常、取得操作 (get を含む) はブロックされないため、更新操作 (put および remove を含む) と重複する場合があります。検索は、開始時に保持されている最新の更新操作の結果を反映します。putAll や clear などの集計操作の場合、同時取得では、一部のエントリのみの挿入または削除が反映される場合があります。
なぜ一部のエントリだけなのですか?
意味を理解するには、最初と最後の部分を一緒に読む必要があります。分解すると、次のことがわかります。
次に、次の場合に何が起こるかを考えてみましょうputAll
(これは ConcurrentHashMap.java ソースです)。
for (Map.Entry<? extends K, ? extends V> e : m.entrySet())
put(e.getKey(), e.getValue());
各エントリがループでマップに追加されることに注意してください。100 個のエントリで呼び出しputAll
、50% まで進んだ場合、別のスレッドget
がマップから値を取得しようとするputAll
と、その時点で使用できるエントリは 50 個だけになります。
具体的には、ドキュメントでは、特定のエントリが使用できないことを通知していません。互いに同期されていないため、別のスレッドで呼び出す前に集計操作全体が完了していない可能性があるだけです。get
変更の「一部」のみが表示される場合があります。これは、またはの実行中に別のスレッドがマップにアクセスする可能性があるためです。どちらも、一部しか完了していない場合に、完了するまでに多くの手順が必要です。putAll()
clear()
putAll
アトミック操作ではありclear
ません。そのため、1 つのスレッドがputAll
いくつかのエントリを配置するために呼び出し、別のスレッドが並行して値を取得すると、putAll
操作の中間状態が表示される場合があります。putAll
メソッドが完了するまでマップはブロックされません。(クリアの場合も同様 -クリア操作が並行して実行されている間に値を取得できます)。