From d5a012828462af3eb6249b441a3580516e1ef8a8 Mon Sep 17 00:00:00 2001 From: Robert Varga Date: Thu, 28 Oct 2021 14:11:14 +0200 Subject: [PATCH 1/1] Use VarHandle for toStringCache We are using VarHandle for hashCode, there let's do the same for toStringCache. Change-Id: I3a94b5fdee3daa700e2352974ac3d5d1094f71ef Signed-off-by: Robert Varga (cherry picked from commit addc049310e45f470cdf285da9b5103c95c61598) --- .../yang/data/api/YangInstanceIdentifier.java | 49 ++++++++++++------- 1 file changed, 31 insertions(+), 18 deletions(-) diff --git a/data/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/YangInstanceIdentifier.java b/data/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/YangInstanceIdentifier.java index 31ea97a027..9572c88519 100644 --- a/data/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/YangInstanceIdentifier.java +++ b/data/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/YangInstanceIdentifier.java @@ -23,6 +23,8 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Sets; import edu.umd.cs.findbugs.annotations.SuppressFBWarnings; import java.io.Serializable; +import java.lang.invoke.MethodHandles; +import java.lang.invoke.VarHandle; import java.lang.reflect.Array; import java.util.AbstractMap.SimpleImmutableEntry; import java.util.ArrayList; @@ -36,7 +38,6 @@ import java.util.Map.Entry; import java.util.Objects; import java.util.Optional; import java.util.Set; -import java.util.concurrent.atomic.AtomicReferenceFieldUpdater; import java.util.function.Function; import org.eclipse.jdt.annotation.NonNull; import org.eclipse.jdt.annotation.Nullable; @@ -80,12 +81,22 @@ import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode; // to data nodes -- most notably XPath expressions and {@code default} statement arguments need to be able // to represent these. public abstract class YangInstanceIdentifier implements HierarchicalIdentifier { - private static final AtomicReferenceFieldUpdater TOSTRINGCACHE_UPDATER = - AtomicReferenceFieldUpdater.newUpdater(YangInstanceIdentifier.class, String.class, "toStringCache"); private static final long serialVersionUID = 4L; + private static final VarHandle TO_STRING_CACHE; + + static { + try { + TO_STRING_CACHE = MethodHandles.lookup().findVarHandle(YangInstanceIdentifier.class, "toStringCache", + String.class); + } catch (NoSuchFieldException | IllegalAccessException e) { + throw new ExceptionInInitializerError(e); + } + } + private final int hash; - private transient volatile String toStringCache = null; + @SuppressWarnings("unused") + private transient String toStringCache = null; // Package-private to prevent outside subclassing YangInstanceIdentifier(final int hash) { @@ -343,22 +354,24 @@ public abstract class YangInstanceIdentifier implements HierarchicalIdentifier