ConcurrentHashMap の Javadoc から:
更新操作間で許可される同時実行数は、オプションの concurrencyLevel コンストラクター引数 (デフォルトは 16) によって決まります。これは、内部サイズ設定のヒントとして使用されます。
「これは内部サイジングのヒントとして使用されます」という部分がわかりません。. これは何を意味するのでしょうか ?この値を設定するためのベスト プラクティスは何ですか。また、どのような保証が得られますか?
ConcurrentHashMap の Javadoc から:
更新操作間で許可される同時実行数は、オプションの concurrencyLevel コンストラクター引数 (デフォルトは 16) によって決まります。これは、内部サイズ設定のヒントとして使用されます。
「これは内部サイジングのヒントとして使用されます」という部分がわかりません。. これは何を意味するのでしょうか ?この値を設定するためのベスト プラクティスは何ですか。また、どのような保証が得られますか?
Javadoc の次の文を見てください。
テーブルは内部的に分割され、指定された数の同時更新を競合なしで許可しようとします。ハッシュ テーブル内の配置は基本的にランダムであるため、実際の同時実行数は異なります。理想的には、同時にテーブルを変更するスレッド数に対応できる値を選択する必要があります。必要以上に高い値を使用すると、スペースと時間が浪費される可能性があり、極端に低い値を使用すると、スレッドの競合が発生する可能性があります。しかし、1 桁以内の過大評価と過小評価は、通常、それほど顕著な影響を及ぼしません。1 つのスレッドのみが変更され、他のすべてのスレッドは読み取りのみが行われることがわかっている場合は、値 1 が適切です。また、このハッシュ テーブルやその他の種類のハッシュ テーブルのサイズ変更は比較的時間がかかるため、可能な場合は、
つまり、16 の concurencyLevel は、ConcurrentHashMap がデータを格納する 16 個の個別のハッシュテーブルを内部的に作成することを意味します。1 つのハッシュテーブルのデータを変更する操作では、他のハッシュテーブルをロックする必要がないため、マップ全体へのある程度の同時アクセスが可能になります。
ConcurrentHashMap のソースを読んでみてください。
同時実行レベルは、内部ロック メカニズムを使用せずに同時に呼び出すことができるマップ上の操作の数とほぼ同じです。Maat b が ConcurrentHashMap には N 個の内部ハッシュテーブルがあるため、異なるハッシュテーブルで動作する操作に追加のロックは必要ないと言っているように、操作が同じ内部ハッシュテーブルで動作している場合、ConcurrenyHashMap はそれらに追加の内部ロックを使用します。