2015-10-30 3 views
-1

У меня есть сомнения в понимании concurrenthashmap. Если раздел консистентной хэш-карты заблокирован потоком записи, то возможно ли, чтобы поток считывателя одновременно просматривал один и тот же раздел карты хешмапа? или нужен ли замок, который должен быть выпущен из потока писателя?Чтение и запись в concurrenthashmap

+0

Вы спрашиваете о * использовании * ConcurrentHashMap или о том, как оно реализовано *? – assylias

+3

Прочитайте первые два параграфа ['ConcurrentHashMap' Javadoc] (https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html). Собственно, прочитайте все это. – Tomas

+0

@ Томас 100% правильно – Braj

ответ

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(); 
     } 
    }