diff --git a/modules/cpr/src/main/java/org/atmosphere/cache/AbstractBroadcasterCache.java b/modules/cpr/src/main/java/org/atmosphere/cache/AbstractBroadcasterCache.java index 55b35d5cdf5..09296648c34 100644 --- a/modules/cpr/src/main/java/org/atmosphere/cache/AbstractBroadcasterCache.java +++ b/modules/cpr/src/main/java/org/atmosphere/cache/AbstractBroadcasterCache.java @@ -59,7 +59,10 @@ import java.io.Serializable; import java.util.ArrayList; +import java.util.Collections; import java.util.Iterator; +import java.util.LinkedHashSet; +import java.util.LinkedList; import java.util.List; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.Executors; @@ -76,7 +79,7 @@ public abstract class AbstractBroadcasterCache implements BroadcasterCache { private static final Logger logger = LoggerFactory.getLogger(AbstractBroadcasterCache.class); - protected final List queue = new CopyOnWriteArrayList(); + protected final List queue = Collections.synchronizedList(new LinkedList()); protected ScheduledExecutorService reaper = Executors.newSingleThreadScheduledExecutor(); @@ -100,7 +103,9 @@ public void run() { if (System.currentTimeMillis() - message.currentTime() > maxCachedinMs) { logger.trace("Pruning: {}", message.message()); - queue.remove(message); + synchronized (AbstractBroadcasterCache.this) { + queue.remove(message); + } } else { break; }