diff --git a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/LazilyInstantiate.java b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/LazilyInstantiate.java index 24f9af51..90de0f7d 100644 --- a/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/LazilyInstantiate.java +++ b/spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/LazilyInstantiate.java @@ -26,27 +26,29 @@ import java.util.function.Supplier; */ public final class LazilyInstantiate implements Supplier { + private volatile T t; private final Supplier supplier; - private Supplier current; - private LazilyInstantiate(Supplier supplier) { this.supplier = supplier; - this.current = () -> swapper(); } public static LazilyInstantiate using(Supplier supplier) { - return new LazilyInstantiate(supplier); + return new LazilyInstantiate<>(supplier); } - public synchronized T get() { - return this.current.get(); - } - - private T swapper() { - T obj = this.supplier.get(); - this.current = () -> obj; - return obj; + public T get() { + T localT = t; + if (localT == null) { + synchronized (this) { + localT = t; + if (localT == null) { + localT = supplier.get(); + t = localT; + } + } + } + return localT; } }