0

Java 7 ConcurrentHashMapの内部実装を行っている間に、私は新しいSegmentを設定することに気付きました.OnDered書き込みを行い、比較およびスワップアルゴリズムを使用してノンブロッキング動作をサポートするUnsafeクラスを使用しています。同時HashMapのは、&書き込みを読んで、単一リンクのためのリストの非ブロッキングの代わりのセグメントにロックを取得して、単独リストをリンクするために書き込みを維持するために&スワップアルゴリズムまたは類似のものを比較する使用していない理由をJava 7 ConcurrentHashMapでは、書き込み中にセグメントロックが必要なのはなぜですか?私たちがUnsafeを使って物事を非ブロックにすることができないのはなぜですか?

私の疑いがありますか?

答えて

0

Unsafeクラスのメソッドは、一般に安全ではありません。ライブラリを記述しているソフトウェアエンジニアが、同時にデータにアクセスしている可能性があることや、さまざまなプロセッサアーキテクチャ上でプリミティブがどのように実装されているかといった知識など、他の制約のために使用できると判断した場合にのみ使用されます。

この場合、Oracleの一部のエンジニアは、Unsafeクラスをセグメント操作に使用できますが、単一リンク・リストには使用できないと判断しました。

+0

はい、私はUnsafeクラスを優先する必要はなく、代わりにAtomicReferenceArrayを使用して同じことを達成できたことを理解しています。それにもかかわらず、セグメントにロックを使用することになった制限が何であるかを理解しようとしています。 –

+0

あなたが理解しようとするべきことは、使用されたUnsafeクラスの使用が許可された異常な状況です。 –

+0

実際、ConcurrentHashMapのドキュメントでは、AtomicReferenceArrayが内部的にUnsafeを使用して、揮発性書き込みの代わりに順序付けされた書き込みを提供するため、Indirectionのレベルを下げるために使用されていることが既に説明されています。また、私の理解が正しい場合にメモリバリアを作成する揮発性の書き込みを回避するのに役立つので、より良いパフォーマンスが得られます。私が間違っていれば私を修正してください。 –

関連する問題