のJava 8:
今ConcurrentHashMap
ではなく、各バケットは、固有の同期を使用して「ストライプ」として機能し、全く固定ロックストライピング方式を使用していません。
コードソースから:
/** Implementation for put and putIfAbsent */
final V putVal(K key, V value, boolean onlyIfAbsent) {
...
Node<K,V> f; int n, i, fh;
...
else if ((f = tabAt(tab, i = (n - 1) & hash)) == null) {
...
synchronized (f) {
...
}
}
そしてコンストラクタはドキュメントが言うようにジャストサイズのヒントとしてそれを使用するパラメータを持っています。
concurrencyLevel - 同時に更新されるスレッドの推定数。実装では、この値をサイジングヒントとして使用できます。
ソース:
public ConcurrentHashMap(int initialCapacity,
float loadFactor, int concurrencyLevel) {
if (!(loadFactor > 0.0f) || initialCapacity < 0 || concurrencyLevel <= 0)
throw new IllegalArgumentException();
if (initialCapacity < concurrencyLevel) // Use at least as many bins
initialCapacity = concurrencyLevel; // as estimated threads
long size = (long)(1.0 + (long)initialCapacity/loadFactor);
int cap = (size >= (long)MAXIMUM_CAPACITY) ?
MAXIMUM_CAPACITY : tableSizeFor((int)size);
this.sizeCtl = cap;
}
だからConcurrentHashMap
はあなたのためにそれを処理します、自分でそれを考慮する必要はありません。
マップに同時にアクセスできるスレッドの数は分かりますか? – rolve
これは、現在システムにログインしているユーザーがいないことに依存します。 – csk