public synchronized KeyedFuture<K, V> put(K key) {
		KeyedFuture<K, V> future = futures.get(key);
		if (future != null) {
			return future;
		}
		future = new KeyedFuture<>(key);
		putFuture(key, future);
		return future;
	}
Provide an out-of-band value for a given key

<p>
If this is called before {@link #get(Object)}, the computation given at construction is
ignored for the given key. A new {@link CompletableFuture} is returned instead. The caller
must see to this future's completion. Subsequent calls to either {@link #get(Object)} or
{@link #put(Object)} on the same key return this same future without starting any
computation.

<p>
Under normal circumstances, the caller cannot determine whether or not it has "claimed" the
computation for the key. If the usual computation is already running, then the computations
are essentially in a race. As such, it is essential that alternative computations result in
the same value for a given key as the usual computation. In other words, the functions must
not differ, but the means of computation can differ. Otherwise, race conditions may arise.

@param key the key whose value to provide
@return a promise that the caller must fulfill or arrange to have fulfilled
Ghidra/Framework/Generic/src/main/java/ghidra/async/AsyncLazyMap.java