У меня есть сомнения в понимании concurrenthashmap. Если раздел консистентной хэш-карты заблокирован потоком записи, то возможно ли, чтобы поток считывателя одновременно просматривал один и тот же раздел карты хешмапа? или нужен ли замок, который должен быть выпущен из потока писателя?Чтение и запись в concurrenthashmap
-1
A
ответ
0
Блокировка не требуется для чтения. Для обновления карты необходимы блокировки.
+1
Если вы используете CHM, вам не нужно ничего блокировать ... – assylias
0
Если вы посмотрите на исходный код 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();
}
}
Вы спрашиваете о * использовании * ConcurrentHashMap или о том, как оно реализовано *? – assylias
Прочитайте первые два параграфа ['ConcurrentHashMap' Javadoc] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html). Собственно, прочитайте все это. – Tomas
@ Томас 100% правильно – Braj