X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=common%2Futil%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fyangtools%2Futil%2FReadOnlyTrieMap.java;h=0082ff3f5f782191e97c5de564601f4743b44757;hb=94ce73de754dde1d931d7d19e6eeb79de997bdef;hp=4d429f1aaa11c899f6759cea472d48dabde75171;hpb=0eb60011b52e4e56c62b47a36eb334f2c3b3ad6a;p=yangtools.git diff --git a/common/util/src/main/java/org/opendaylight/yangtools/util/ReadOnlyTrieMap.java b/common/util/src/main/java/org/opendaylight/yangtools/util/ReadOnlyTrieMap.java index 4d429f1aaa..0082ff3f5f 100644 --- a/common/util/src/main/java/org/opendaylight/yangtools/util/ReadOnlyTrieMap.java +++ b/common/util/src/main/java/org/opendaylight/yangtools/util/ReadOnlyTrieMap.java @@ -7,14 +7,13 @@ */ package org.opendaylight.yangtools.util; -import java.util.Map; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - import com.google.common.base.Preconditions; import com.google.common.collect.ForwardingMap; import com.romix.scala.collection.concurrent.TrieMap; +import java.util.Map; +import java.util.concurrent.atomic.AtomicReferenceFieldUpdater; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * A read-only facade in front of a TrieMap. This is what we give out from @@ -24,6 +23,9 @@ import com.romix.scala.collection.concurrent.TrieMap; * changes, we can cache it for future reference. */ final class ReadOnlyTrieMap extends ForwardingMap { + @SuppressWarnings("rawtypes") + private static final AtomicReferenceFieldUpdater UPDATER = + AtomicReferenceFieldUpdater.newUpdater(ReadOnlyTrieMap.class, TrieMap.class, "readOnly"); private static final Logger LOG = LoggerFactory.getLogger(ReadOnlyTrieMap.class); private final TrieMap readWrite; private final int size; @@ -45,15 +47,11 @@ final class ReadOnlyTrieMap extends ForwardingMap { protected Map delegate() { TrieMap ret = readOnly; if (ret == null) { - synchronized (this) { + ret = readWrite.readOnlySnapshot(); + if (!UPDATER.compareAndSet(this, null, ret)) { ret = readOnly; - if (ret == null) { - ret = readWrite.readOnlySnapshot(); - readOnly = ret; - } } } - return ret; }