diff --git a/core-server/src/main/java/org/glassfish/jersey/server/ServerRuntime.java b/core-server/src/main/java/org/glassfish/jersey/server/ServerRuntime.java index 1cf7e0a1e5..b615e4894e 100644 --- a/core-server/src/main/java/org/glassfish/jersey/server/ServerRuntime.java +++ b/core-server/src/main/java/org/glassfish/jersey/server/ServerRuntime.java @@ -956,8 +956,16 @@ private boolean resume(final Runnable handler) { stateLock.readLock().unlock(); } stateLock.writeLock().lock(); - state = RESUMED; - stateLock.writeLock().unlock(); + try { + // Re-check under write lock: another thread may have changed state + // between releasing the read lock and acquiring the write lock. + if (state != SUSPENDED) { + return false; + } + state = RESUMED; + } finally { + stateLock.writeLock().unlock(); + } try { responder.runtime.requestScope.runInScope(requestContext, handler); @@ -1019,9 +1027,20 @@ private boolean cancel(final Value responseValue) { } stateLock.writeLock().lock(); - state = RESUMED; - cancelled = true; - stateLock.writeLock().unlock(); + try { + // Re-check under write lock: another thread may have changed state + // between releasing the read lock and acquiring the write lock. + if (cancelled) { + return true; + } + if (state != SUSPENDED) { + return false; + } + state = RESUMED; + cancelled = true; + } finally { + stateLock.writeLock().unlock(); + } responder.runtime.requestScope.runInScope(requestContext, new Runnable() { @Override