docs: protected @CheckForNull T get(@Nonnull String key, boolean createIfNotExist, P createParams) throws IOException {
          while(true) {
              totalQuery.incrementAndGet();
              Object value = core.get(key);
  
              if(value instanceof SoftReference) {
                  SoftReference<T> wfp = (SoftReference<T>) value;
                  T t = wfp.get();
                  if(t!=null) {
                      cacheHit.incrementAndGet();
                      return t;  // found it
                  }
                  weakRefLost.incrementAndGet();
              }
              if(value instanceof Loading) {
                  // another thread is loading it. get the value from there.
                  T t = ((Loading<T>)value).get();
                  if(t!=null || !createIfNotExist)
                      return t;   // found it (t!=null) or we are just 'get' (!createIfNotExist)
              }
  
              // the fingerprint doesn't seem to be loaded thus far, so let's load it now.
              // the care needs to be taken that other threads might be trying to do the same.
              Loading<T> l = new Loading<>();
              if(value==null ? core.putIfAbsent(key,l)!=null : !core.replace(key,value,l)) {
                  // the value has changed since then. another thread is attempting to do the same.
                  // go back to square 1 and try it again.
                  continue;
              }
  
              T t = null;
              try {
                  t = load(key);
                  if(t==null && createIfNotExist) {
                      t = create(key,createParams);    // create the new data
                      if(t==null)
                          throw new IllegalStateException("Bug in the derived class"); // bug in the derived classes
                  }
              } catch(IOException e) {
                  loadFailure.incrementAndGet();
                  throw e;
              } finally {
                  // let other threads know that the value is available now.
                  // when the original thread failed to load, this should set it to null.
                  l.set(t);
              }
  
              // the map needs to be updated to reflect the result of loading
              if(t!=null)
                  core.put(key, new SoftReference<>(t));
              else
                  core.remove(key);
  
              return t;
          }
  
      }