diff --git a/activemq-broker/src/main/java/org/apache/activemq/broker/region/Topic.java b/activemq-broker/src/main/java/org/apache/activemq/broker/region/Topic.java index 714f95ef694..fea004093e2 100644 --- a/activemq-broker/src/main/java/org/apache/activemq/broker/region/Topic.java +++ b/activemq-broker/src/main/java/org/apache/activemq/broker/region/Topic.java @@ -860,11 +860,12 @@ protected void dispatch(final ConnectionContext context, Message message) throws } } - synchronized (consumers) { - if (consumers.isEmpty()) { - onMessageWithNoConsumers(context, message); - return; - } + // CopyOnWriteArrayList.isEmpty() is a volatile snapshot read; no + // monitor needed — the check is advisory at message granularity + // either way (subscription cutover is quiesced by dispatchLock). + if (consumers.isEmpty()) { + onMessageWithNoConsumers(context, message); + return; } // Clear memory before dispatch - need to clear here because the call to