code: private ImmutableList<EndPoint> getEndPoints() {
          ImmutableList<EndPoint> endPoints = _endPoints;
          if (endPoints == null) {
              boolean locked = false;
              try {
                  long timeout = System.currentTimeMillis() + 10;
  
                  locked = _lock.tryLock(10, TimeUnit.MILLISECONDS);
                  if (locked) {
                      endPoints = _endPoints;
                      long waitTime = timeout - System.currentTimeMillis();
                      if (endPoints == null && waitTime > 0) {
                          _endpointsAvailable.await(waitTime, TimeUnit.MILLISECONDS);
                          endPoints = _endPoints;
                      }
                  }
              } catch (InterruptedException e) {
                  // ignore
              } finally {
                  if (locked) {
                      _lock.unlock();
                  }
              }
  
              if (endPoints == null) {
                  // Took too long waiting for the background to re-populate endpoints, just fetch from the source
                  endPoints = getEndPointsFromHostDiscovery();
              }
          }
          
          return endPoints;
      }
docs: Returns the current list of endPoints.  If possible a cached version is used, so typically this is faster than
  calling {@link #getEndPointsFromHostDiscovery()} and reuses an existing immutable list rather than rebuilding a
  new one on each call.