Index: core/src/main/java/quickfix/Session.java =================================================================== --- core/src/main/java/quickfix/Session.java (revision 999) +++ core/src/main/java/quickfix/Session.java (working copy) @@ -29,6 +29,7 @@ import java.util.Map; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicReference; +import java.util.concurrent.locks.ReentrantLock; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -308,7 +309,7 @@ private boolean enabled; - private final String responderSync = "SessionResponderSync"; + private final ReentrantLock responderSync = new ReentrantLock(true); // @GuardedBy(responderSync) private Responder responder; @@ -453,19 +454,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(); } } @@ -1837,7 +1844,8 @@ * IO error */ public void disconnect(String reason, boolean logError) throws IOException { - synchronized (responderSync) { + responderSync.lock(); + try { if (!hasResponder()) { getLog().onEvent("Already disconnected: " + reason); return; @@ -1850,6 +1858,8 @@ } responder.disconnect(); setResponder(null); + } finally { + responderSync.unlock(); } final boolean logonReceived = state.isLogonReceived(); @@ -2215,13 +2225,18 @@ private boolean send(String messageString) { getLog().onOutgoing(messageString); - synchronized (responderSync) { - if (!hasResponder()) { - getLog().onEvent("No responder, not sending message: " + messageString); - return false; - } - return getResponder().send(messageString); + Responder responder; + responderSync.lock(); + try { + responder = this.responder; + } finally { + responderSync.unlock(); } + if (responder == null) { + getLog().onEvent("No responder, not sending message: " + messageString); + return false; + } + return responder.send(messageString); } private boolean isCorrectCompID(String senderCompID, String targetCompID) {