3

ConcurrentHashMapのイテレータコードを理解しようとしていますが、コードを見ると、ConcurrentHashMap#values()#iteratorがnull値を返す可能性があるようです。

null値を追加できない場合でも、removeを呼び出すと、最初に値がnullとしてマークされるため、これが発生する可能性があると思います。

これは本当ですか、それともイテレータにこれを処理する方法がありますか?

4

1 に答える 1

2

実装方法を見るget()と、ConcuurrentHashMapは、エントリ値がnullクラス初期化競合によるものである状況を考慮してコーディングされているようです(これは、への呼び出しによって処理されSegment.readValueUnderLock()ます。値イテレータは値をチェックしないようです。のエントリnullなので、有効な質問があるようです(反復中に発生し、この可能性を変える他の揮発性操作があるかどうかはわかりません)。

ただし、Segment.readValueUnderLock()メソッドには次のjavadocノートがあります。

ロックされているエントリの値フィールドを読み取ります。値フィールドがnullのように見える場合に呼び出されます。これは、コンパイラがHashEntryの初期化をテーブル割り当てで並べ替えた場合にのみ可能です。これは、メモリモデルでは有効です が、発生することは知られていないためです。

(最後の強調鉱山)。

おそらくダグ・リーにとって良い質問になるでしょう。

于 2012-09-13T15:13:13.517 に答える