Fix synchronization in DeserializingClassRenamesProvider Fix bad use of double-checked locking.
Project: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/commit/b10d23b0 Tree: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/tree/b10d23b0 Diff: http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/diff/b10d23b0 Branch: refs/heads/master Commit: b10d23b0868625064a683048fe490e0fedbdf774 Parents: 10c6576 Author: Aled Sage <[email protected]> Authored: Fri Sep 18 19:26:41 2015 +0100 Committer: Aled Sage <[email protected]> Committed: Mon Sep 21 14:33:19 2015 +0100 ---------------------------------------------------------------------- .../persist/DeserializingClassRenamesProvider.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-brooklyn/blob/b10d23b0/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/DeserializingClassRenamesProvider.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/DeserializingClassRenamesProvider.java b/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/DeserializingClassRenamesProvider.java index 9fbac01..9c8c056 100644 --- a/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/DeserializingClassRenamesProvider.java +++ b/core/src/main/java/org/apache/brooklyn/core/mgmt/persist/DeserializingClassRenamesProvider.java @@ -38,19 +38,22 @@ public class DeserializingClassRenamesProvider { public static final String DESERIALIZING_CLASS_RENAMES_PROPERTIES_PATH = "classpath://org/apache/brooklyn/core/mgmt/persist/deserializingClassRenames.properties"; - private static Map<String, String> cache = null; + private static volatile Map<String, String> cache; @Beta public static Map<String, String> loadDeserializingClassRenames() { - if (cache!=null) return cache; - synchronized (DeserializingClassRenamesProvider.class) { - cache = loadDeserializingClassRenamesCache(); - return cache; + // Double-checked locking - got to use volatile or some such! + if (cache == null) { + synchronized (DeserializingClassRenamesProvider.class) { + if (cache == null) { + cache = loadDeserializingClassRenamesCache(); + } + } } + return cache; } - private synchronized static Map<String, String> loadDeserializingClassRenamesCache() { - if (cache!=null) return cache; + private static Map<String, String> loadDeserializingClassRenamesCache() { InputStream resource = new ResourceUtils(DeserializingClassRenamesProvider.class).getResourceFromUrl(DESERIALIZING_CLASS_RENAMES_PROPERTIES_PATH); if (resource != null) { try {
