code: synchronized Provider getProvider() {
          // volatile variable load
          Provider p = provider;
          if (p != null) {
              return p;
          }
          if (shouldLoad() == false) {
              return null;
          }
          if (isLoading) {
              // because this method is synchronized, this can only
              // happen if there is recursion.
  //            if (debug != null) {
  //                debug.println("Recursion loading provider: " + this);
  //                new Exception("Call trace").printStackTrace();
  //            }
              return null;
          }
          try {
              isLoading = true;
              tries++;
              p = doLoadProvider();
          } finally {
              isLoading = false;
          }
          provider = p;
          return p;
      }
docs: Get the provider object. Loads the provider if it is not already loaded.