X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=yang%2Fyang-data-api%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Fyang%2Fdata%2Fapi%2FYangInstanceIdentifier.java;h=62c876b530495e8cdf151e4585f45a7216a4a577;hb=b43b9ed6f627a4a1d2ecc6081ed4f0024761e4a3;hp=84ebdf0f2035f30446e0098220050a80e9e7399d;hpb=448c005a625dd6ae602cd15e36404571da6c1a37;p=yangtools.git
diff --git a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/YangInstanceIdentifier.java b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/YangInstanceIdentifier.java
index 84ebdf0f20..62c876b530 100644
--- a/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/YangInstanceIdentifier.java
+++ b/yang/yang-data-api/src/main/java/org/opendaylight/yangtools/yang/data/api/YangInstanceIdentifier.java
@@ -13,9 +13,13 @@ import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
-
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.io.ObjectStreamException;
import java.io.Serializable;
import java.lang.reflect.Array;
+import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@@ -25,7 +29,7 @@ import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
import java.util.Set;
-
+import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
import org.opendaylight.yangtools.concepts.Builder;
import org.opendaylight.yangtools.concepts.Immutable;
import org.opendaylight.yangtools.concepts.Path;
@@ -64,27 +68,44 @@ import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode;
*
*
*
- * @see http://tools.ietf.org/html/rfc6020#section-9.13
+ * @see RFC6020
*/
public final class YangInstanceIdentifier implements Path, Immutable, Serializable {
+ @SuppressWarnings("rawtypes")
+ private static final AtomicReferenceFieldUpdater LEGACYPATH_UPDATER =
+ AtomicReferenceFieldUpdater.newUpdater(YangInstanceIdentifier.class, ImmutableList.class, "legacyPath");
+ private static final AtomicReferenceFieldUpdater TOSTRINGCACHE_UPDATER =
+ AtomicReferenceFieldUpdater.newUpdater(YangInstanceIdentifier.class, String.class, "toStringCache");
private static final YangInstanceIdentifier EMPTY = trustedCreate(Collections.emptyList());
+ private static final Field PATHARGUMENTS_FIELD;
- private static final long serialVersionUID = 2L;
- private final Iterable pathArguments;
+ private static final long serialVersionUID = 3L;
+ private transient final Iterable pathArguments;
private final int hash;
- private transient volatile ImmutableList legacyPath = null;
+ private volatile ImmutableList legacyPath = null;
private transient volatile String toStringCache = null;
+ static {
+ final Field f;
+ try {
+ f = YangInstanceIdentifier.class.getDeclaredField("pathArguments");
+ } catch (NoSuchFieldException | SecurityException e) {
+ throw new ExceptionInInitializerError(e);
+ }
+ f.setAccessible(true);
+
+ PATHARGUMENTS_FIELD = f;
+ }
+
private final ImmutableList getLegacyPath() {
// Temporary variable saves a volatile read
ImmutableList ret = legacyPath;
if (ret == null) {
- synchronized (this) {
- // We could have used a synchronized block, but let's just not bother
- ret = ImmutableList.copyOf(pathArguments);
- legacyPath = ret;
- }
+ // We could have used a synchronized block, but the window is quite
+ // small and worst that can happen is duplicate object construction.
+ ret = ImmutableList.copyOf(pathArguments);
+ LEGACYPATH_UPDATER.lazySet(this, ret);
}
return ret;
@@ -141,7 +162,7 @@ public final class YangInstanceIdentifier implements Path path) {
@@ -296,19 +317,6 @@ public final class YangInstanceIdentifier implements Path HASH_UPDATER =
+ AtomicReferenceFieldUpdater.newUpdater(AbstractPathArgument.class, Integer.class, "hash");
private static final long serialVersionUID = -4546547994250849340L;
private final QName nodeType;
private volatile transient Integer hash = null;
@@ -380,13 +390,8 @@ public final class YangInstanceIdentifier implements Path {
/**
@@ -463,7 +464,14 @@ public final class YangInstanceIdentifier implements PathRFC6020
*/
public static final class AugmentationIdentifier implements PathArgument {
private static final long serialVersionUID = -8122335594681936939L;
@@ -627,18 +635,6 @@ public final class YangInstanceIdentifier implements Path childNames) {
- this(childNames);
- }
-
/**
* Returns set of all possible child nodes
*
@@ -750,7 +746,7 @@ public final class YangInstanceIdentifier implements Path