@Override
      Node<V> find(int h, int k) {
        for (Node<V> e = first; e != null; ) {
          int s;
          if (((s = lockState) & (WAITER | WRITER)) != 0) {
            if ((e.key == k)) {
              return e;
            }
            e = e.next;
          }
          else if (Unsafe.compareAndSwapInt(this, LOCKSTATE, s,
                                               s + READER)) {
            TreeNode<V> r;
            TreeNode<V> p;
            try {
              p = ((r = root) == null ? null :
                   r.findTreeNode(h, k));
            }
            finally {
              Thread w;
              if (getAndAddInt(this, LOCKSTATE, -READER) ==
                              (READER | WAITER) && (w = waiter) != null) {
                LockSupport.unpark(w);
              }
            }
            return p;
          }
        }
        return null;
      }
@Override
      Node<V> find(int h, int k)