From 82717fa2054093d7c54ae8b1702e5bd5607a1e7a 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 9ba943d5de1..3fba7376850 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() {