jdk/src/share/classes/sun/util/resources/OpenListResourceBundle.java
changeset 13583 dc0017b1a452
parent 11130 c7093e306a34
child 14342 8435a30053c1
--- a/jdk/src/share/classes/sun/util/resources/OpenListResourceBundle.java	Tue Aug 21 13:42:08 2012 +0100
+++ b/jdk/src/share/classes/sun/util/resources/OpenListResourceBundle.java	Tue Aug 21 11:00:30 2012 -0700
@@ -42,6 +42,7 @@
 
 import java.util.Enumeration;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Map;
 import java.util.ResourceBundle;
 import java.util.Set;
@@ -93,6 +94,24 @@
         return lookup.keySet();
     }
 
+    @Override
+    public Set<String> keySet() {
+        if (keyset != null) {
+            return keyset;
+        }
+        Set<String> ks = new HashSet<>();
+        ks.addAll(handleGetKeys());
+        if (parent != null) {
+            ks.addAll(parent.keySet());
+        }
+        synchronized (this) {
+            if (keyset == null) {
+                keyset = ks;
+            }
+        }
+        return keyset;
+    }
+
     /**
      * Returns the parent bundle
      */
@@ -118,11 +137,7 @@
      * We lazily load the lookup hashtable.  This function does the
      * loading.
      */
-    private synchronized void loadLookup() {
-        if (lookup != null) {
-            return;
-        }
-
+    private void loadLookup() {
         Object[][] contents = getContents();
         Map<String, Object> temp = createMap(contents.length);
         for (int i = 0; i < contents.length; ++i) {
@@ -134,7 +149,11 @@
             }
             temp.put(key, value);
         }
-        lookup = temp;
+        synchronized (this) {
+            if (lookup == null) {
+                lookup = temp;
+            }
+        }
     }
 
     /**
@@ -145,5 +164,6 @@
         return new HashMap<>(size);
     }
 
-    private Map<String, Object> lookup = null;
+    private volatile Map<String, Object> lookup = null;
+    private volatile Set<String> keyset;
 }