2011-07-11 7 views
1

java.util.ConcurrentHashMapのソースコードを読んで、ConcurrentHashMap $ HashEntryのnextフィールドがfinalであることを確認しています。 nextの値を変更するには、追加と削除の2つの操作があります。しかし、この2つの操作は、nextフィールドが最終的なものではなくても安全に実行されます。だから私はなぜnextフィールドが最終的であるのか理解できません、誰でも私に理由を教えてくれますか?ありがとう。 の(ほとんどの)読み取りが同期なしで行われるため、読み取りスレッドがフィールドの初期値を確認するためには、

答えて

1

finalオンが必要です。例えば、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

関連する問題