Path: blob/1.21.x/src/main/java/net/minecraftforge/common/util/ClearableLazy.java
7542 views
/*1* Copyright (c) Forge Development LLC and contributors2* SPDX-License-Identifier: LGPL-2.1-only3*/45package net.minecraftforge.common.util;678import org.jetbrains.annotations.NotNull;9import org.jetbrains.annotations.Nullable;1011import java.util.function.Supplier;1213public interface ClearableLazy<T> extends Lazy<T> {14void invalidate();1516/**17* Constructs a lazy-initialized object18* @param supplier The supplier for the value, to be called the first time the value is needed.19*/20static <T> ClearableLazy<T> of(@NotNull Supplier<T> supplier) {21return new ClearableLazy.Fast<T>(supplier);22}2324/**25* Constructs a thread-safe lazy-initialized object26* @param supplier The supplier for the value, to be called the first time the value is needed.27*/28static <T> ClearableLazy<T> concurrentOf(@NotNull Supplier<T> supplier) {29return new ClearableLazy.Concurrent<>(supplier);30}3132/**33* Non-thread-safe implementation.34*/35final class Fast<T> implements ClearableLazy<T> {36private final Supplier<T> supplier;37private T instance;3839private Fast(Supplier<T> supplier) {40this.supplier = supplier;41}4243@Nullable44@Override45public final T get() {46if (instance == null) {47instance = supplier.get();48}49return instance;50}5152@Override53public void invalidate() {54this.instance = null;55}56}5758/**59* Thread-safe implementation.60*/61final class Concurrent<T> implements ClearableLazy<T> {62private final Object lock = new Object();63private final Supplier<T> supplier;64private volatile T instance;6566private Concurrent(Supplier<T> supplier) {67this.supplier = supplier;68}6970@Nullable71@Override72public final T get()73{74var ret = instance;75if (ret == null) {76synchronized (lock) {77if (instance == null) {78return instance = supplier.get();79}80}81}82return ret;83}8485@Override86public void invalidate() {87synchronized (lock) {88this.instance = null;89}90}91}92}939495