package org.netbeans.gradle.model.util;
import java.lang.ref.WeakReference;
import java.util.concurrent.atomic.AtomicReference;
public final class ConstructableWeakRef<T> implements NbSupplier5<T> {
private final NbSupplier5<? extends T> objFactory;
private final AtomicReference<WeakReference<T>> defaultRefRef;
public ConstructableWeakRef(NbSupplier5<? extends T> objFactory) {
if (objFactory == null) throw new NullPointerException("objFactory");
this.objFactory = objFactory;
this.defaultRefRef = new AtomicReference<WeakReference<T>>();
}
public T get() {
while (true) {
WeakReference<T> defaultRef = defaultRefRef.get();
T defaultCache = defaultRef != null ? defaultRef.get() : null;
if (defaultCache == null) {
defaultCache = objFactory.get();
if (!defaultRefRef.compareAndSet(defaultRef, new WeakReference<T>(defaultCache))) {
continue;
}
}
return defaultCache;
}
}
}