diff --git a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrSessionTracker.java b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrSessionTracker.java index dcbf13388b88..6af4830c59b4 100644 --- a/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrSessionTracker.java +++ b/jetty-websocket/javax-websocket-client-impl/src/main/java/org/eclipse/jetty/websocket/jsr356/JsrSessionTracker.java @@ -19,19 +19,21 @@ package org.eclipse.jetty.websocket.jsr356; import java.util.Collections; +import java.util.HashSet; import java.util.Set; -import java.util.concurrent.CopyOnWriteArraySet; +import java.util.concurrent.ConcurrentHashMap; +import javax.websocket.Session; import org.eclipse.jetty.util.component.AbstractLifeCycle; import org.eclipse.jetty.util.component.LifeCycle; public class JsrSessionTracker extends AbstractLifeCycle implements JsrSessionListener { - private CopyOnWriteArraySet sessions = new CopyOnWriteArraySet<>(); + private final Set sessions = Collections.newSetFromMap(new ConcurrentHashMap<>()); - public Set getSessions() + public Set getSessions() { - return Collections.unmodifiableSet(sessions); + return Collections.unmodifiableSet(new HashSet<>(sessions)); } @Override @@ -49,7 +51,7 @@ public void onSessionClosed(JsrSession session) @Override protected void doStop() throws Exception { - for (JsrSession session : sessions) + for (Session session : sessions) { LifeCycle.stop(session); } diff --git a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/SessionTracker.java b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/SessionTracker.java index 15bc8de4ffb3..635f1a9d2ce1 100644 --- a/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/SessionTracker.java +++ b/jetty-websocket/websocket-common/src/main/java/org/eclipse/jetty/websocket/common/SessionTracker.java @@ -20,8 +20,9 @@ import java.io.IOException; import java.util.Collections; +import java.util.HashSet; import java.util.Set; -import java.util.concurrent.CopyOnWriteArraySet; +import java.util.concurrent.ConcurrentHashMap; import org.eclipse.jetty.util.component.AbstractLifeCycle; import org.eclipse.jetty.util.component.Dumpable; @@ -29,11 +30,11 @@ public class SessionTracker extends AbstractLifeCycle implements WebSocketSessionListener, Dumpable { - private CopyOnWriteArraySet sessions = new CopyOnWriteArraySet<>(); + private final Set sessions = Collections.newSetFromMap(new ConcurrentHashMap<>()); public Set getSessions() { - return Collections.unmodifiableSet(sessions); + return Collections.unmodifiableSet(new HashSet<>(sessions)); } @Override