code: private Object waitingGet(boolean interruptible) {
          Signaller q = null;
          boolean queued = false;
          int spins = SPINS;
          Object r;
          while ((r = result) == null) {
              if (spins > 0) {
                  if (ThreadLocalRandom.nextSecondarySeed() >= 0)
                      --spins;
              }
              else if (q == null)
                  q = new Signaller(interruptible, 0L, 0L);
              else if (!queued)
                  queued = tryPushStack(q);
              else {
                  try {
                      ForkJoinPool.managedBlock(q);
                  } catch (InterruptedException ie) { // currently cannot happen
                      q.interrupted = true;
                  }
                  if (q.interrupted && interruptible)
                      break;
              }
          }
          if (q != null) {
              q.thread = null;
              if (q.interrupted) {
                  if (interruptible)
                      cleanStack();
                  else
                      Thread.currentThread().interrupt();
              }
          }
          if (r != null)
              postComplete();
          return r;
      }
docs: Returns raw result after waiting, or null if interruptible and
  interrupted.