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)