docs: public final Link advance()
      {
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) SibTr.entry(this, tc, "advance");
  
          Link replyLink = null;
          Link newLastLink = null;
          synchronized (_parent)
          {
              // We start our search from either the lastLink we found, or the dummyHead.
              Link lookAt = _lastLink;
              if (null == lookAt)
              {
                  lookAt = _parent.getDummyHead();
              }
  
              // We now move to the first link that we have not seen.
              lookAt = lookAt.getNextPhysicalLink();
  
              // this loop will move through list until it finds a link that is
              // in the linked state. If none is found replyLink will be null
              // after the loop. Note that the Tail link is not counted
              while (null != lookAt && null == replyLink)
              {
                  if (lookAt.isTail())
                  {
                      // we do not count the dummy tail. Signal an end to the search with a null
                      lookAt = null;
                  }
                  else
                  {
                      // this is the last link we have examined, so we save it, so we do not need
                      // to traverse it again
                      newLastLink = lookAt;
                      if (lookAt.isLinked())
                      {
                          // the link we are looking at is valid, so we return it
                          replyLink = lookAt;
                      }
                      else
                      {
                          // the link we are looking at is not valid, so we move to the next
                          lookAt = lookAt.getNextPhysicalLink();
                      }
                  }
              }
  
              if (null != newLastLink)
              {
                  // we have found a new 'lastLink' and so must move the reference
                  // and adjust cursor counters as needed. We may not find a new
                  // link - if the original 'lastLink' was at the end of a list.
                  //
                  // NOTE that we do not move in the special case that jumpback has been
                  // disabled and we don't have a link to return. This makes it less likely
                  // that items which are changing state will be skipped over by a cursor
                  // with jumpback disabled, obviously at the cost of looking at them
                  // again and again.
                  if (_jumpbackEnabled || (replyLink != null))
                  {
                      if (null != _lastLink)
                      {
                          _lastLink.decrementCursorCount();
                      }
                      _lastLink = newLastLink;
                      _lastLink.incrementCursorCount();
                  }
              }
          }
  
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled()) SibTr.exit(this, tc, "advance", replyLink);
          return replyLink;
      }