de.thksystems.util.lang.Deferred Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of cumin Show documentation
Show all versions of cumin Show documentation
Commons for lang, crypto, xml, dom, text, csv, reflection, annotations, parsing, ...
/*
* tksCommons
*
* Author : Thomas Kuhlmann (ThK-Systems, http://www.thk-systems.de)
* License : LGPL (https://www.gnu.org/licenses/lgpl.html)
*/
package de.thksystems.util.lang;
import java.util.Objects;
import java.util.function.Supplier;
/**
* Lazy initialization using a {@link Supplier} (thread-safe).
*
* @see "Inspired by http://www.nosid.org/java8-threadsafe-lazy-initialization.html"
*/
public final class Deferred {
private volatile boolean initialized = false;
private final Supplier resultSupplier;
private T result = null;
public Deferred(Supplier resultSupplier) {
this.resultSupplier = Objects.requireNonNull(resultSupplier);
}
public T get() {
if (!initialized) {
synchronized (this) {
if (!initialized) { // Double safety
result = resultSupplier.get();
initialized = true;
}
}
}
return result;
}
public boolean isInitialized() {
return initialized;
}
public void invalidate() {
initialized = false;
}
}