code: public V retrieveOrCreate(K key, Factory<V> factory) {
          // Clean up stale entries on every put.
          // This should avoid a slow memory leak of reference objects.
          this.cleanUpStaleEntries();
          return retrieveOrCreate(key, factory, new FutureRef<V>());
      }
docs: Create a value for the given key iff one has not already been stored.
  This method is safe to be called concurrently from multiple threads.
  It will ensure that only one thread succeeds to create the value for the given key.
  
  @return the created/retrieved {@link AppClassLoader}