If it's truly an instance of lazy instantiation, then I'd suggest using the enum holder pattern described by Josh Bloch in Effective Java. Otherwise, volatile works, but it looks uglier.
Tejay -----Original Message----- From: David Medinets [mailto:[email protected]] Sent: Wednesday, September 12, 2012 3:47 PM To: accumulo-dev Subject: EXTERNAL: Double Checked Locking - broken? working? I see the following code in the Property class: public static boolean isValidTablePropertyKey(String key) { if (validTableProperties == null) { synchronized (Property.class) { if (validTableProperties == null) { HashSet<String> tmp = new HashSet<String>(); for (Property p : Property.values()) if (!p.getType().equals(PropertyType.PREFIX) && p.getKey().startsWith(Property.TABLE_PREFIX.getKey())) tmp.add(p.getKey()); validTableProperties = tmp; } } } return validTableProperties.contains(key) || key.startsWith(Property.TABLE_CONSTRAINT_PREFIX.getKey()) || key.startsWith(Property.TABLE_ITERATOR_PREFIX.getKey()) || key.startsWith(Property.TABLE_LOCALITY_GROUP_PREFIX.getKey()); } However, http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html says that Double Check Locking does not work. Is there any reason to believe that the article is incorrect? At the end of the article, it recommends using volatile in Java 1.5 and above. Is there any reason the code should not be changed to use the volatile technique?
