diff --git a/jdk/src/share/classes/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java b/jdk/src/share/classes/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java index 4d885f44376..47fdbfb9443 100644 --- a/jdk/src/share/classes/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java +++ b/jdk/src/share/classes/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java @@ -489,7 +489,8 @@ public abstract class AbstractQueuedLongSynchronizer /* * Try to signal next queued node if: * Propagation was indicated by caller, - * or was recorded (as h.waitStatus) by a previous operation + * or was recorded (as h.waitStatus either before + * or after setHead) by a previous operation * (note: this uses sign-check of waitStatus because * PROPAGATE status may transition to SIGNAL.) * and @@ -501,7 +502,8 @@ public abstract class AbstractQueuedLongSynchronizer * racing acquires/releases, so most need signals now or soon * anyway. */ - if (propagate > 0 || h == null || h.waitStatus < 0) { + if (propagate > 0 || h == null || h.waitStatus < 0 || + (h = head) == null || h.waitStatus < 0) { Node s = node.next; if (s == null || s.isShared()) doReleaseShared(); diff --git a/jdk/src/share/classes/java/util/concurrent/locks/AbstractQueuedSynchronizer.java b/jdk/src/share/classes/java/util/concurrent/locks/AbstractQueuedSynchronizer.java index f0bdeb9030e..dce35765df7 100644 --- a/jdk/src/share/classes/java/util/concurrent/locks/AbstractQueuedSynchronizer.java +++ b/jdk/src/share/classes/java/util/concurrent/locks/AbstractQueuedSynchronizer.java @@ -711,7 +711,8 @@ public abstract class AbstractQueuedSynchronizer /* * Try to signal next queued node if: * Propagation was indicated by caller, - * or was recorded (as h.waitStatus) by a previous operation + * or was recorded (as h.waitStatus either before + * or after setHead) by a previous operation * (note: this uses sign-check of waitStatus because * PROPAGATE status may transition to SIGNAL.) * and @@ -723,7 +724,8 @@ public abstract class AbstractQueuedSynchronizer * racing acquires/releases, so most need signals now or soon * anyway. */ - if (propagate > 0 || h == null || h.waitStatus < 0) { + if (propagate > 0 || h == null || h.waitStatus < 0 || + (h = head) == null || h.waitStatus < 0) { Node s = node.next; if (s == null || s.isShared()) doReleaseShared();