From e140700175d257ec854c5d13b6f081397b9425e7 Mon Sep 17 00:00:00 2001 From: BJ Hargrave Date: Mon, 26 Sep 2022 10:03:05 -0400 Subject: [PATCH] deferred value: Memoize value to ensure at-most-once supplier call Since we are using deferred values to defer expensive operations, we don't want concurrent threads all performing the expensive operation. So we memoize the result of the operation to ensure at-most-once. Signed-off-by: BJ Hargrave --- .../src/aQute/bnd/osgi/resource/DeferredValue.java | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/biz.aQute.bndlib/src/aQute/bnd/osgi/resource/DeferredValue.java b/biz.aQute.bndlib/src/aQute/bnd/osgi/resource/DeferredValue.java index 9ba943d5de..3fba737685 100644 --- a/biz.aQute.bndlib/src/aQute/bnd/osgi/resource/DeferredValue.java +++ b/biz.aQute.bndlib/src/aQute/bnd/osgi/resource/DeferredValue.java @@ -4,25 +4,22 @@ import java.util.function.Supplier; +import aQute.bnd.memoize.Memoize; + class DeferredValue implements Supplier { private final Class type; private final Supplier supplier; private final int hashCode; - private T value; DeferredValue(Class type, Supplier supplier, int hashCode) { this.type = requireNonNull(type); - this.supplier = requireNonNull(supplier); + this.supplier = Memoize.supplier(supplier); this.hashCode = hashCode; } @Override public T get() { - T v = value; - if (v == null) { - return value = supplier.get(); - } - return v; + return supplier.get(); } Class type() {