ConcurrentHashMap
で、マップ オブジェクト全体がロックされておらず、代わりにマップの一部がロックされていることをどこかで読みました。
誰かがロックがいつ登場するか詳しく説明できますか?
マップの読み取り中はロックは行われませんが、更新中はロックのみが使用されますか?
ConcurrentHashMap
で、マップ オブジェクト全体がロックされておらず、代わりにマップの一部がロックされていることをどこかで読みました。
誰かがロックがいつ登場するか詳しく説明できますか?
マップの読み取り中はロックは行われませんが、更新中はロックのみが使用されますか?
はい、ConcurrentHashMap
多数のロック (デフォルトでは 16 個) を使用します。各ロックはハッシュの 1 つのセグメントを制御します。
特定のセグメントにデータを設定すると、そのセグメントのロックが取得されます。
データを取得するときは、揮発性読み取りが使用されます。揮発性読み取りが失敗した場合、セグメントのロックは、読み取り成功の最後の試行のために取得されます。
スレッドセーフでありながら、ロックは可能な限り最小限に抑えられます。
「Map の一部がロックされている」と説明すると、これは、更新時に (キーのハッシュに基づいて) Map の「1/concurrencyLevel」のみがロックされることを意味します。これは、2 つの更新がそれぞれ別々の「バケット」に影響する場合でも安全に同時に実行できることを意味します。これにより、ロックの競合が最小限に抑えられ、パフォーマンスが最大化されます。
さらに重要なのは、JDK の実装を信頼することです。JDK の実装の詳細について心配する必要はありません (たとえば、リリースごとに変更される可能性があります)。むしろ、コードを書くことに集中してください。