From 1e203af4d9b8bc3c5147bc0a09181440d4d52d8c Mon Sep 17 00:00:00 2001 From: erabii Date: Thu, 10 Dec 2020 20:37:58 -0500 Subject: [PATCH] improvments on lazy instance (#685) --- .../kubernetes/commons/LazilyInstantiate.java | 26 ++++++++++--------- 1 file changed, 14 insertions(+), 12 deletions(-) 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; } }