WALProvider getProvider() throws IOException {
    Configuration conf = factory.getConf();
    for (;;) {
      WALProvider provider = this.holder.get();
      if (provider != null) {
        return provider;
      }
      Class<? extends WALProvider> clz = null;
      if (conf.get(providerConfigName) == null) {
        try {
          clz = conf.getClass(WALFactory.WAL_PROVIDER, Providers.defaultProvider.clazz,
            WALProvider.class);
        } catch (Throwable t) {
          // the WAL provider should be an enum. Proceed
        }
      }
      if (clz == null) {
        clz = factory.getProviderClass(providerConfigName,
          conf.get(WALFactory.WAL_PROVIDER, WALFactory.DEFAULT_WAL_PROVIDER));
      }
      provider = WALFactory.createProvider(clz);
      provider.init(factory, conf, providerId, this.abortable);
      provider.addWALActionsListener(new MetricsWAL());
      if (this.holder.compareAndSet(null, provider)) {
        return provider;
      } else {
        // someone is ahead of us, close and try again.
        provider.close();
      }
    }
  }
A lazy initialized WAL provider for holding the WALProvider for some special tables, such as
hbase:meta, hbase:replication, etc.
hbase-server/src/main/java/org/apache/hadoop/hbase/wal/LazyInitializedWALProvider.java