private final void treeifyBin(Node<V>[] tab, int index) {
      Node<V> b; int n;
      if (tab != null) {
          if ((n = tab.length) < MIN_TREEIFY_CAPACITY)
              tryPresize(n << 1);
          else if ((b = tabAt(tab, index)) != null && b.hash >= 0) {
              synchronized (b) {
                  if (tabAt(tab, index) == b) {
                      TreeNode<V> hd = null, tl = null;
                      for (Node<V> e = b; e != null; e = e.next) {
                          TreeNode<V> p =
                              new TreeNode<V>(e.hash, e.key, e.val,
                                                null, null);
                          if ((p.prev = tl) == null)
                              hd = p;
                          else
                              tl.next = p;
                          tl = p;
                      }
                      setTabAt(tab, index, new TreeBin<V>(hd));
                  }
              }
          }
      }
  }
private final void treeifyBin(Node<V>[] tab, int index)