Java ConcurrentHashMap を拡張するタイミングと拡張プロセス

ConcurrentHashMap は、内部でセグメント ロック (Segment) と呼ばれるメカニズムを使用して、スレッド セーフを実現します。各セグメントは実際には小さなハッシュ テーブルであり、これらが集まって ConcurrentHashMap 全体の構造を形成します。

ConcurrentHashMap の拡張は、ConcurrentHashMap 全体の拡張ではなく、内部セグメントで実行されます。ConcurrentHashMap のセグメント内のリンクされたリストの長さがしきい値 (デフォルトでは 8) を超えると、セグメントの拡張がトリガーされます。

拡張プロセスは次のとおりです。

  1. まず、セグメントはセグメントの拡張ロックの取得を試みます。ロックが正常に取得された場合は、セグメントが拡張されており、他のスレッドがブロックされていることを意味します。ロックの取得が失敗した場合は、他のスレッドがすでに拡張操作を実行していることを意味し、現在のスレッドは待機します。

  2. 拡張ロックを取得した後、セグメントはセグメント内の要素を新しいセグメントにバッチで移行します。このプロセスは同時に実行され、複数のスレッドが異なる要素を同時に移行できます。

  3. 移行プロセス中に他のスレッドがセグメントに書き込むと、新しい書き込み操作はブロックされ、移行が完了するまで待ってから続行します。

  4. 移行が完了すると、元のセグメントは新しいセグメントを指すようになり、拡張ロックが解放され、他のスレッドは引き続きセグメントの読み取りと書き込みを行うことができます。

要素の移行プロセスにはコピーや再ハッシュなどの要素が含まれるため、ConcurrentHashMap の拡張プロセスでは一定のパフォーマンスのオーバーヘッドが発生することに注意してください。ただし、拡張操作は複数のスレッド間で同時に実行できるため、拡張プロセス全体をシリアル操作よりも速く完了できます。

ConcurrentHashMap のセグメンテーション ロック メカニズムと拡張戦略により、同時実行性の高い環境でのパフォーマンスとスケーラビリティが向上し、マルチスレッドの読み取りおよび書き込み操作をサポートできます。

おすすめ

転載: blog.csdn.net/a772304419/article/details/131030782