Index: core/src/main/java/quickfix/Session.java =================================================================== --- core/src/main/java/quickfix/Session.java (revision 926) +++ core/src/main/java/quickfix/Session.java (working copy) @@ -27,6 +27,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.locks.ReentrantLock; import quickfix.Message.Header; import quickfix.field.BeginSeqNo; @@ -231,7 +232,7 @@ private boolean enabled; - private final String responderSync = "SessionResponderSync"; + private final ReentrantLock responderSync = new ReentrantLock(true); // @GuardedBy(responderSync) private Responder responder; @@ -330,19 +331,25 @@ * @param responder a responder implementation */ public void setResponder(Responder responder) { - synchronized (responderSync) { + responderSync.lock(); + try { this.responder = responder; if (responder != null) { stateListener.onConnect(); } else { stateListener.onDisconnect(); } + } finally { + responderSync.unlock(); } } public Responder getResponder() { - synchronized (responderSync) { + responderSync.lock(); + try { return responder; + } finally { + responderSync.unlock(); } } @@ -1436,13 +1443,16 @@ * @throws IOException IO error */ public void disconnect() throws IOException { - synchronized (responderSync) { + responderSync.lock(); + try { if (!hasResponder()) { return; } getLog().onEvent("Disconnecting"); responder.disconnect(); setResponder(null); + } finally { + responderSync.unlock(); } boolean logonReceived = state.isLogonReceived(); @@ -1778,14 +1788,19 @@ private boolean send(String messageString) { getLog().onOutgoing(messageString); - synchronized (responderSync) { - if (!hasResponder()) { - getLog().onEvent( - "Attempt to send while not connected (message stored until connected)."); - return false; - } - return getResponder().send(messageString); + Responder responder; + responderSync.lock(); + try { + responder = this.responder; + } finally { + responderSync.unlock(); } + if (responder == null) { + getLog().onEvent( + "Attempt to send while not connected (message stored until connected)."); + return false; + } + return responder.send(messageString); } private boolean isCorrectCompID(String senderCompID, String targetCompID) {