android/guava/src/com/google/common/cache/CacheBuilder.java
public <K1 extends K, V1 extends V> LoadingCache<K1, V1> build(
      CacheLoader<? super K1, V1> loader) {
    checkWeightWithWeigher();
    return new LocalCache.LocalLoadingCache<>(this, loader);
  }
public <K1 extends K, V1 extends V> LoadingCache<K1, V1> build(
      CacheLoader<? super K1, V1> loader) {
    checkWeightWithWeigher();
    return new LocalCache.LocalLoadingCache<>(this, loader);
  }
Builds a cache, which either returns an already-loaded value for a given key or atomically
computes or retrieves it using the supplied {@code CacheLoader}. If another thread is currently
loading the value for this key, simply waits for that thread to finish and returns its loaded
value. Note that multiple threads can concurrently load values for distinct keys.

<p>This method does not alter the state of this {@code CacheBuilder} instance, so it can be
invoked again to create multiple independent caches.

@param loader the cache loader used to obtain new values
@return a cache having the requested features