final V putVal(long key, V value, boolean onlyIfAbsent) {
    int hash = spread(key);
      int binCount = 0;
      for (Node<V>[] tab = table;;) {
          Node<V> f; int n, i, fh; long fk; V fv;
        if (tab == null || (n = tab.length) == 0) {
          tab = initTable();
        }
        else if ((f = tabAt(tab, i = (n - 1) & hash)) == null) {
          if (casTabAt(tab, i, new Node<V>(hash, key, value, null))) {
            break;                   // no lock when adding to empty bin
          }
        }
        else if ((fh = f.hash) == MOVED) {
          tab = helpTransfer(tab, f);
        }
        else if (onlyIfAbsent // check first node without acquiring lock
                 && fh == hash
                 && ((fk = f.key) == key)
                 && (fv = f.val) != null) {
          return fv;
        }
        else {
          V oldVal = null;
          synchronized (f) {
            if (tabAt(tab, i) == f) {
              if (fh >= 0) {
                binCount = 1;
                for (Node<V> e = f; ; ++binCount) {
                  long ek;
                  if (e.hash == hash &&
                      ((ek = e.key) == key)) {
                    oldVal = e.val;
                    if (!onlyIfAbsent) {
                      e.val = value;
                    }
                    break;
                  }
                  Node<V> pred = e;
                  if ((e = e.next) == null) {
                    pred.next = new Node<V>(hash, key, value, null);
                    break;
                  }
                }
              }
              else if (f instanceof TreeBin) {
                Node<V> p;
                binCount = 2;
                if ((p = ((TreeBin<V>)f).putTreeVal(hash, key,
                                                    value)) != null) {
                  oldVal = p.val;
                  if (!onlyIfAbsent) {
                    p.val = value;
                  }
                }
              }
              else if (f instanceof ReservationNode) {
                throw new IllegalStateException("Recursive update");
              }
            }
          }
          if (binCount != 0) {
            if (binCount >= TREEIFY_THRESHOLD) {
              treeifyBin(tab, i);
            }
            if (oldVal != null) {
              return oldVal;
            }
            break;
          }
        }
      }
      addCount(1L, binCount);
      return null;
  }
final V putVal(long key, V value, boolean onlyIfAbsent)