Index: lams_learning/src/java/org/lamsfoundation/lams/learning/command/CommandWebsocketServer.java =================================================================== RCS file: /usr/local/cvsroot/lams_learning/src/java/org/lamsfoundation/lams/learning/command/Attic/CommandWebsocketServer.java,v diff -u -r1.1.2.5 -r1.1.2.6 --- lams_learning/src/java/org/lamsfoundation/lams/learning/command/CommandWebsocketServer.java 30 Jan 2017 04:13:20 -0000 1.1.2.5 +++ lams_learning/src/java/org/lamsfoundation/lams/learning/command/CommandWebsocketServer.java 2 Mar 2017 08:38:28 -0000 1.1.2.6 @@ -1,13 +1,13 @@ package org.lamsfoundation.lams.learning.command; import java.io.IOException; -import java.util.Collections; import java.util.Date; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.TreeMap; +import java.util.concurrent.ConcurrentHashMap; import javax.websocket.CloseReason; import javax.websocket.OnClose; @@ -50,19 +50,13 @@ // websocket communication bypasses standard HTTP filters, so Hibernate session needs to be initialised manually HibernateSessionManager.openSession(); try { - // synchronize websockets as a new Learner entering Learner interface could modify this collection - Iterator>> entryIterator = null; - synchronized (CommandWebsocketServer.websockets) { - entryIterator = CommandWebsocketServer.websockets.entrySet().iterator(); - } + Iterator>> entryIterator = CommandWebsocketServer.websockets + .entrySet().iterator(); Entry> entry = null; // go through lessons and update registered learners with messages do { - synchronized (CommandWebsocketServer.websockets) { - entry = entryIterator.hasNext() ? entryIterator.next() : null; - } - + entry = entryIterator.hasNext() ? entryIterator.next() : null; if (entry != null) { Long lessonId = entry.getKey(); Long lastSendTime = lastSendTimes.get(lessonId); @@ -74,9 +68,7 @@ // if all learners left the lesson, remove the obsolete mapping Map lessonWebsockets = entry.getValue(); if (lessonWebsockets.isEmpty()) { - synchronized (CommandWebsocketServer.websockets) { - entryIterator.remove(); - } + entryIterator.remove(); lastSendTimes.remove(lessonId); } } @@ -123,8 +115,7 @@ private static Logger log = Logger.getLogger(CommandWebsocketServer.class); private static final SendWorker sendWorker = new SendWorker(); - private static final Map> websockets = Collections - .synchronizedMap(new TreeMap>()); + private static final Map> websockets = new ConcurrentHashMap>(); static { // run the singleton thread @@ -139,7 +130,7 @@ Long lessonId = Long.valueOf(websocket.getRequestParameterMap().get(AttributeNames.PARAM_LESSON_ID).get(0)); Map sessionWebsockets = CommandWebsocketServer.websockets.get(lessonId); if (sessionWebsockets == null) { - sessionWebsockets = Collections.synchronizedMap(new TreeMap()); + sessionWebsockets = new ConcurrentHashMap(); CommandWebsocketServer.websockets.put(lessonId, sessionWebsockets); }