public void publish(String topicName, Object data) { // First clone the list of subscriptions Set<MessageListener> listeners; synchronized (subscriptions) { Set<MessageListener> current = subscriptions.get(topicName); if (current == null) { return; } listeners = new HashSet<MessageListener>(); listeners.addAll(current); } // Then tell everyone about the message for (MessageListener listener : listeners) { MessageEvent event; if (data instanceof MessageEvent) { event = (MessageEvent) data; } else { event = new DefaultMessageEvent(this, data); } listener.onMessage(event); } }