値が揮発性の
Entry
クラスにあるのはなぜですか。ConcurrentHashMap
トラバーサル中に、クラスが null の
ConcurrentHashMap
場合、セグメント全体をロックし、値を再度読み取ろうとするチェックインがあります。値だけを null にできるのはどのような場合ですか? 値だけでなく、エントリ全体が null になる必要があります。value
Entry
また、セグメント全体をロックすることで、値が null になった場合に正しいトラバーサルを保証する方法。
1 に答える
1
値は主に揮発性であるため、ConcurrentHashMap は読み取り時にブロックする必要がありません。'ing の場合
put
、CHM はセグメントをロックしてセグメントごとに 1 つの書き込みを保証しますが、他のスレッドはそのセグメントから読み取ることができます。値は揮発性であるため、CHM は引き続き発生前の順序付けを維持します。JMM では、コンストラクター内の揮発性ストアを、オブジェクトの公開後に遅延または再順序付けできます。そのため、エントリが公開されていても、volatile フィールドがまだ表示されていない可能性があります。これは「非常に安全」にするために入れられましたが、実際には起こりません (少なくとも Java 6 では)。
プットが行われるとき、それはセグメントのロックの下で行われます。同じロックを取得すると、後続の書き込みがその書き込みの後の読み取りから見えるようになることを保証します (これは、ロックの下で発生した書き込みが同じロックの下での将来の読み取りから見えるようになるロックと同期の別の保証です。これはそうします)ただし、ロック書き込みと揮発性読み取りには当てはまりません)。
于 2012-01-12T15:07:11.370 に答える