public synchronized CompletableFuture<T> request() {
		if (future == null) {
			future = supplier.get();
			future.exceptionally((exc) -> {
				synchronized (this) {
					lastExc = exc;
					future = null;
				}
				// We return the future, not the result of exceptionally
				// So no need to rethrow here
				return null;
			});
		}
		// It's possible the future completed exceptionally on this thread, so future may be null
		if (future == null) {
			return CompletableFuture.failedFuture(lastExc);
		}
		return future;
	}
Request the value

If this is called before {@link #provide()}, the computation given at construction is
launched. The {@link CompletableFuture} it provides is returned immediately. Subsequent calls
to either {@link #request()} or {@link #provide()} return the same future without starting
any new computation.

@return a future, possibly already completed, for the value
Ghidra/Framework/Generic/src/main/java/ghidra/async/AsyncLazyValue.java