docs: private final AbstractItemLink _next(long lockID) throws SevereMessageStoreException
      {
          // first look for an available link that we can lock. We scan the tree
          // removing each element as we find it. If we are able to lock the link
          // we use it.
          AbstractItemLink lockedMatchingLink = null;
          if (_jumpbackEnabled)
          {
              while (null == lockedMatchingLink)
              {
                  AbstractItemLink link;
  
                  // Get and remove the first AIL in the list of AILs behind the current position
                  synchronized(this)
                  {
                      link = _behindList.getFirst(true);
                  }
  
                  if (link == null)
                  {
                      break;
                  }
                  else if (link.lockItemIfAvailable(lockID))
                  {
                      lockedMatchingLink = link;
  
                      if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) SibTr.debug(this, tc, "using available: " + lockedMatchingLink);
                  }
              }
          }
  
          if (null == lockedMatchingLink)
          {
              // we didn't find and lock an available link, so we must now resume
              // the traverse of the linked list
              AbstractItemLink lookAtLink;
              synchronized(this)
              {
                  lookAtLink = (AbstractItemLink)advance();
              }
  
              while (null != lookAtLink && null == lockedMatchingLink)
              {
                  // update our position for each link we examine in the chain
                  long pos = lookAtLink.getPosition();
                  synchronized(this)
                  {
                      if (pos > _highestPosition)
                      {
                          _highestPosition = pos;
  
                          if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) SibTr.debug(this, tc, "examine " + lookAtLink + "(seq = " + _highestPosition + ")");
                      }
                  }
  
                  // try to lock the link
                  //
                  // PAY ATTENTION
                  //
                  // This can read from the persistence layer so we MUST not be synchronized
                  // on this subcursor for the sake of concurrency (although it will not deadlock).
                  // Defect 298364 (sev 1) was raised to reflect a delay of several minutes due to this
                  if (lookAtLink.lockIfMatches(_filter, lockID))
                  {
                      // we matched and locked the link
                      lockedMatchingLink = lookAtLink;
  
                      if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled()) SibTr.debug(this, tc, "found: " + lockedMatchingLink);
                  }
                  else
                  {
                      // we didn't get the link - it didn't match or didn't lock. Advance
                      synchronized(this)
                      {
                          lookAtLink = (AbstractItemLink)advance();
                      }
                  }
              }
          }
  
          return lockedMatchingLink;
      }