code: private void doAcquireInterruptibly(long arg)
          throws InterruptedException {
          final Node node = addWaiter(Node.EXCLUSIVE);
          try {
              for (;;) {
                  final Node p = node.predecessor();
                  if (p == head && tryAcquire(arg)) {
                      setHead(node);
                      p.next = null; // help GC
                      return;
                  }
                  if (shouldParkAfterFailedAcquire(p, node) &&
                      parkAndCheckInterrupt())
                      throw new InterruptedException();
              }
          } catch (Throwable t) {
              cancelAcquire(node);
              throw t;
          }
      }
docs: Acquires in exclusive interruptible mode.
  @param arg the acquire argument