我怀疑了并发hashmap。如果conc hashmap的一部分被编写器线程锁定,那么读者线程是否可以同时读取同一部分的hashmap映射?或者它是否需要从作者线程中释放锁?
答案 0 :(得分:1)
如果您查看ConcurrentHashMap.get()的源代码,那么您可以轻松理解它。
从并发地图中读取时需要 无锁,但如果值为null
,则会在readValueUnderLock下再次检查
get(Object key, int hash) {
if (count != 0) { // read-volatile
HashEntry<K,V> e = getFirst(hash);
while (e != null) {
if (e.hash == hash && key.equals(e.key)) {
V v = e.value;
if (v != null)
return v;
return readValueUnderLock(e); // recheck
}
e = e.next;
}
}
return null;
}
readValueUnderLock(HashEntry<K,V> e) {
lock();
try {
return e.value;
} finally {
unlock();
}
}
查看ConcurrentHashMap.put()方法,首先调用lock()
,最后调用unlock()
put(K key, int hash, V value, boolean onlyIfAbsent) {
lock();
try {
...
} finally {
unlock();
}
}
答案 1 :(得分:0)
读取时无需锁定。更新地图需要锁定。