From 3c6e85d967ee0b0b29ce7670372a83c3f8c8045b Mon Sep 17 00:00:00 2001 From: srosse <none@none> Date: Fri, 6 Jun 2014 11:32:39 +0200 Subject: [PATCH] OO-1000: block-free string syncher --- .../coordinate/util/DerivedStringSyncer.java | 23 +++++++++---------- 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/main/java/org/olat/core/util/coordinate/util/DerivedStringSyncer.java b/src/main/java/org/olat/core/util/coordinate/util/DerivedStringSyncer.java index 8167d4e76f5..44619e7e09c 100644 --- a/src/main/java/org/olat/core/util/coordinate/util/DerivedStringSyncer.java +++ b/src/main/java/org/olat/core/util/coordinate/util/DerivedStringSyncer.java @@ -25,8 +25,8 @@ */ package org.olat.core.util.coordinate.util; -import java.util.HashMap; -import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; import org.olat.core.id.OLATResourceable; @@ -51,7 +51,7 @@ public class DerivedStringSyncer { public static DerivedStringSyncer INSTANCE = new DerivedStringSyncer(); // keys: OLATResource-Type:ResourceId ;values: Objects - private Map<String, Object> synchLockHashmap = new HashMap<String, Object>(); + private ConcurrentMap<String, Object> synchLockHashmap = new ConcurrentHashMap<String, Object>(); public static DerivedStringSyncer getInstance() { return INSTANCE; @@ -66,16 +66,15 @@ public class DerivedStringSyncer { * @return */ public Object getSynchLockFor(OLATResourceable ores) { - Object synchLock; - String key = ores.getResourceableTypeName() + ":" - + ores.getResourceableId(); - synchronized (synchLockHashmap) { //o_clusterOK by:fj, since this class is only used by implementations of Syncer (and those provide correct singlevm/cluster code) - synchLock = synchLockHashmap.get(key); - if (synchLock == null) { - synchLock = new Object(); - synchLockHashmap.put(key, synchLock); + String key = ores.getResourceableTypeName() + ":" + ores.getResourceableId(); + Object synchLock = synchLockHashmap.get(key); + if(synchLock == null) { + Object newSynchLock = new Object(); + synchLock = synchLockHashmap.putIfAbsent(key, newSynchLock); + if(synchLock == null) { + synchLock = newSynchLock; } - } // end of synchronized + } return synchLock; } } -- GitLab