code: private synchronized void startThenLoadData() {
          if (_closed) {
              return;
          }
  
          try {
              _pathCache.start(PathChildrenCache.StartMode.BUILD_INITIAL_CACHE);
          } catch (Throwable t) {
              waitThenStartAgain();
              return;
          }
  
          loadExistingData();
      }
docs: Start the underlying path cache and then populate the data for any nodes that existed prior to being created and
  connected to ZooKeeper.
  <p/>
  This must be synchronized so async remove events aren't processed between start() and adding nodes.
  Use synchronous start(true) instead of asynchronous start(false) so we can tell when it's done and the
  node discovery set is usable.
  <p/>
  If there is a problem starting the path cache then we'll continue attempting to start it in a background thread
  until the node discovery is closed.