public static @NotNull <T> NotNullLazyValue<T> volatileLazy(@NotNull Supplier<? extends @NotNull T> supplier) {
    return new NotNullLazyValue<T>() {
      private volatile T value;

      @Override
      public @NotNull T getValue() {
        T value = this.value;
        if (value == null) {
          RecursionGuard.StackStamp stamp = RecursionManager.markStack();
          value = compute();
          if (stamp.mayCacheNow()) {
            this.value = value;
          }
        }
        return value;
      }

      @Override
      public boolean isComputed() {
        return value != null;
      }

      @Override
      protected @NotNull T compute() {
        return supplier.get();
      }
    };
  }
public static @NotNull <T> NotNullLazyValue<T> volatileLazy(@NotNull Supplier<? extends @NotNull T> supplier)