2011-07-11 32 views
1

我正在閱讀閱讀java.util.ConcurrentHashMap的源代碼並發現ConcurrentHashMap $ HashEntry中的next字段是final。有兩種操作可以修改next的值:添加和刪除。但是,即使next字段不是最終的,但這兩個操作仍可以安全地進行。所以我不明白爲什麼next這個字段是最終的,誰能告訴我爲什麼?謝謝。

回答

1

nextfinal需要保證讀線程看到該字段的初始值,因爲(大部分)不同步讀取ConcurrentHashMap發生。

注意的是,例如,value不是final,因此讀取線程可以看到在該字段的非初始化的值(null),並且必須重新檢查它在這種情況下下同步:

V 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; 
    } 
+0

所以,final通過讀取線程確保字段的初始化值正確。但爲什麼HashEntry類本身在ConcurrentHashMap中最終? – AKS

相關問題