docs: public static synchronized JSSEProvider getInstance(String inputProvider) {
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              Tr.entry(tc, "getInstance: " + inputProvider);
  
          String contextProvider = inputProvider;
          if (contextProvider == null) {
              if (null != defaultProvider) {
                  if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
                      Tr.exit(tc, "getInstance: " + defaultProvider);
                  return defaultProvider;
              }
              contextProvider = getProviderFromProviderList();
          }
  
          // if still null, revert to default as usual.
          if (contextProvider == null) {
              contextProvider = Constants.IBMJSSE2_NAME;
          }
  
          JSSEProvider cachedProvider = providerCache.get(contextProvider);
  
          if (cachedProvider != null) {
              if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
                  Tr.exit(tc, "getInstance(cached) " + cachedProvider);
              return cachedProvider;
          }
  
          final String contextProviderPriv = contextProvider;
          AccessController.doPrivileged(new PrivilegedAction<Object>() {
              @Override
              public Object run() {
                  Provider provider = Security.getProvider(contextProviderPriv);
  
                  if (provider == null) {
                      try {
                          if (contextProviderPriv.equalsIgnoreCase(Constants.IBMJSSE_NAME)) {
                              provider = (Provider) Class.forName(Constants.IBMJSSE2).newInstance();
                          } else if (contextProviderPriv.equalsIgnoreCase(Constants.SUNJSSE_NAME)) {
                              provider = (Provider) Class.forName("com.sun.net.ssl.internal.ssl.Provider").newInstance();
                          } else {
                              provider = (Provider) Class.forName(Constants.IBMJSSE2).newInstance();
                          }
                          if (provider != null) {
                              Security.addProvider(provider);
                          }
                      } catch (Exception e) {
                          if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
                              Tr.debug(tc, "Exception loading provider: " + contextProviderPriv + "; " + e);
                      }
                  }
                  return null;
              }
          });
  
          Provider[] providerList = Security.getProviders();
  
          for (int i = 0; i < providerList.length && null == cachedProvider; i++) {
              if (TraceComponent.isAnyTracingEnabled() && tc.isDebugEnabled())
                  Tr.debug(tc, "Provider name [" + i + "]: " + providerList[i].getName());
  
              if (providerList[i].getName().equalsIgnoreCase(contextProvider)) {
                  if (contextProvider.equalsIgnoreCase(Constants.IBMJSSE2_NAME) && validateProvider(Constants.IBMJSSE2_NAME)) {
                      cachedProvider = new IBMJSSEProvider();
                      providerCache.put(Constants.IBMJSSE2_NAME, cachedProvider);
                      providerCache.put(contextProvider, cachedProvider);
                  } else if (contextProvider.equalsIgnoreCase(Constants.IBMJSSE_NAME) && validateProvider(Constants.IBMJSSE_NAME)) {
                      cachedProvider = new IBMJSSEProvider();
                      providerCache.put(Constants.IBMJSSE_NAME, cachedProvider);
                      providerCache.put(contextProvider, cachedProvider);
                  } else if (contextProvider.equalsIgnoreCase(Constants.SUNJSSE_NAME) && validateProvider(Constants.SUNJSSE_NAME)) {
                      cachedProvider = new SunJSSEProvider();
                      providerCache.put(Constants.SUNJSSE_NAME, cachedProvider);
                      providerCache.put(contextProvider, cachedProvider);
                  } else {
                      cachedProvider = new IBMJSSEProvider();
                      providerCache.put(Constants.IBMJSSE_NAME, cachedProvider);
                      providerCache.put(contextProvider, cachedProvider);
                  }
              }
          } // end-provider-loop
  
          // if still null, default to IBM JSSE provider
          if (cachedProvider == null) {
              cachedProvider = new IBMJSSEProvider();
              providerCache.put(Constants.IBMJSSE_NAME, cachedProvider);
              providerCache.put(contextProvider, cachedProvider);
          }
  
          if (null == inputProvider) {
              defaultProvider = cachedProvider;
          }
          if (TraceComponent.isAnyTracingEnabled() && tc.isEntryEnabled())
              Tr.exit(tc, "getInstance: " + cachedProvider);
          return cachedProvider;
      }