リンクで書かれたブログは、並行ハッシュマップでの排他的同期を異なる方法で提供し、パフォーマンス指向であると言います:並行ハッシュマップの排他的ロック。並行ハッシュマップにカスタム機能を提供しながら、それが本当に機能するかどうか混乱しています。また、ConcurrentHashMap と同じロックを使用するのだろうか
public class CMap<K, V> {
private final ConcurrentMap<K, V> map = new ConcurrentHashMap<K, V>();
private final Object[] locks = new Object[16]; {
for(int i = 0;i<locks.length;i++) locks[i] = new Object();
}
public V put(K key, V value) {
int hash = key.hashCode() & 0x7FFFFFFF;
synchronized (locks[hash % locks.length]) { // allows concurrent writes.
return map.put(key, value);
}
}
public V get(K key) {
return map.get(key); // concurrent reads.
}
public V putIfAbsentTheHardWay(K key, V value) {
int hash = key.hashCode() & 0x7FFFFFFF;
synchronized (locks[hash % locks.length]) { // supports custom operations.
if (!map.containsKey(key))
return map.put(key, value);
else
return map.get(key);
}
}
}