BUG-1460: make sure DCL works 67/9567/3
authorRobert Varga <rovarga@cisco.com>
Fri, 1 Aug 2014 08:26:58 +0000 (10:26 +0200)
committerRobert Varga <rovarga@cisco.com>
Fri, 1 Aug 2014 08:43:54 +0000 (10:43 +0200)
As the bug correctly notes, the check of non-volatile field can result
in bad effects.

Change-Id: Ifd0d72c28fe53692b037c2ecf861d36d312b4182
Signed-off-by: Robert Varga <rovarga@cisco.com>
common/util/src/main/java/org/opendaylight/yangtools/util/ReadOnlyTrieMap.java

index 88da121c8616f44aba44d633d9e599e1396fc5a4..4d429f1aaa11c899f6759cea472d48dabde75171 100644 (file)
@@ -27,7 +27,7 @@ final class ReadOnlyTrieMap<K, V> extends ForwardingMap<K, V> {
     private static final Logger LOG = LoggerFactory.getLogger(ReadOnlyTrieMap.class);
     private final TrieMap<K, V> readWrite;
     private final int size;
-    private TrieMap<K, V> readOnly;
+    private volatile TrieMap<K, V> readOnly;
 
     ReadOnlyTrieMap(final TrieMap<K, V> map, final int size) {
         super();
@@ -43,15 +43,18 @@ final class ReadOnlyTrieMap<K, V> extends ForwardingMap<K, V> {
 
     @Override
     protected Map<K, V> delegate() {
-        if (readOnly == null) {
+        TrieMap<K, V> ret = readOnly;
+        if (ret == null) {
             synchronized (this) {
-                if (readOnly == null) {
-                    readOnly = readWrite.readOnlySnapshot();
+                ret = readOnly;
+                if (ret == null) {
+                    ret = readWrite.readOnlySnapshot();
+                    readOnly = ret;
                 }
             }
         }
 
-        return readOnly;
+        return ret;
     }
 
     @Override