ConcurrentHashMapの--- putVal

まず、ソースコード添付のJava実装8

1   / ** PUTの導入及びputIfAbsent * / 
2      最終 V putVal(Kキー、V値、ブールonlyIfAbsent){
 3          であれば(キー== NULL ||値== NULLスロー 新しい(NullPointerExceptionが)。
4          int型のハッシュ= スプレッド(key.hashCode())。
5          INT binCount = 0 6          ため(ノード<K、V> []タブ= 表;;){
 7              ノード<K、V> F。int型N、I、FH;
8              もし(タブ== nullを||(= N-tab.length)== 0)// 最初の使用、テーブル全体がヌルである
9。                  タブ= initTable();
 10               IF((F = tabAt(タブ、Iは、N - (= 1)。ハッシュ・))== NULL ){
 11                  IF(casTabAt(タブ、I、NULL 12である                              新しい新しいノード<K、V>(ハッシュ、キー、値、NULL )))
 13である                     BREAK ;                    // NOロック空に追加するときビン
14              }
 15               のiF((FH = f.hash)==移動される)     // -1のノードのハッシュ値、必要に転送すべきノードForwardingNode、後続ノードの代表的な
16                 =タブhelpTransfer(タブ、F)
 。17              {
 18は                  V OLDVAL = NULL ;
 19                  同期(F){
 20は、                     IF(tabAt(タブ、I)== F){ //は正しいコードを得るためのホットゾーンは、第一、再び実行されますi番目のノードが変更されていない前に記録を確認し(すなわち、離れて移行されていない)
21である                         IF(FH> = 0){ // を確認現在のノードのハッシュ値が正常ノード(ノード他の補助、例えばForwardingNode、TreeBinを表すこと、 ReservationNode)
22である                              BinCount = 1 ;
 23である                             ため(ノード<K、V> E = F ;; ++ BinCount){
 24                                  K EK、
 25                                  IF(ハッシュe.hash == &&
 26である                                      ((EK = e.key)は== ||キー
 27                                       (EK!= NULL && key.equals(EK)))){ //は、ターゲット・ノードを解析するスプレッドに基づいていますそして(同じキーまたはキー参照同等の)同じハッシュ値
28                                      OLDVAL = e.val;
 29                                      IF(!onlyIfAbsent)は
 30                                          e.val = 値;
 31である                                     BREAK ;
 32                                  }
 33である                                  ノード<K、V> PRED = E;
 34であります                                 もし((E = e.next)== NULL){ // 現在のノードがリストの最後に達すると、追記新しい要素場合
35                                      pred.next = 新しい新しいノード<K、V> ハッシュ、キー、
 36                                                                値は、NULL ) ;
 37                                      BREAK ;
 38である                                 }
 39                              }
 40                          }
 41である                          のiF(F instanceofの TreeBin){ // FHは0以上であり、-2、要素型TreeBin場合
42である                              ノード<K、V>P;
43                              binCount = 2 44                              であれば((P =((TreeBin <K、V> )F).putTreeVal(ハッシュ、キー、
 45                                                             値))!= NULL ){
 46                                  OLDVAL = p.val。
47                                  もし(!onlyIfAbsent)
 48                                      p.val = 値;
49                              }
 50                          }
 51                      }
 52                  }
 53                  であれば(binCount!= 0){
 54が                     IF(BinCount> = TREEIFY_THRESHOLD)// インサート要素、ノードの数のリストは単一のスロットに等しい場合8より大きい場合、スロットの赤黒木
55                          treeifyBin(タブ、I);
 56は、                     IF(OLDVAL =!ヌル57は、                         リターンOLDVAL;
 58                      BREAK ;
 59                  }
 60              }
 61である         }
 62で          addCount(1L 、BinCount);
 63は         、戻り NULL ;
 64      }
コードの表示

 

A

おすすめ

転載: www.cnblogs.com/neocxf/p/12581015.html