複数の操作をアトミックに実行する必要がある非常にまれな場合を除いて、 Synchronized with ConcurretnHashMap を使用する必要はありません。
サイズを取得するには、同期せずに呼び出すことができます。
ConcurrentHashMap との同期をいつ使用するかを明確にするために...
オンデマンドで作成したい高価なオブジェクトがあるとします。同時読み取りが必要ですが、値が一度だけ作成されるようにする必要もあります。
public ExpensiveObject get(String key) {
return map.get(key); // can work concurrently.
}
public void put(String key, ExepensiveBuilder builder) {
// cannot use putIfAbsent because it needs the object before checking.
synchronized(map) {
if (!map.containsKey(key))
map.put(key, builder.create());
}
}
注: これには、すべての書き込みが同期されている必要がありますが、読み取りは引き続き同時実行できます。