2015-10-30 26 views
-1

我懷疑理解同步散列表。如果一段conc hashmap被一個編寫器線程鎖定,那麼讀者線程是否可以同時讀取同一段hashmap映射?還是它需要鎖從寫入程序線程釋放?在併發散列表中讀寫

+0

你問*關於*使用ConcurrentHashMap或關於它如何實現*? – assylias

+3

閱讀['ConcurrentHashMap' Javadoc]的前兩段(https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html)。其實,全部閱讀。 – Tomas

+0

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