diff --git a/src/java.base/share/classes/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java b/src/java.base/share/classes/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java index f4d7d0c08c0..2de1d17e7c1 100644 --- a/src/java.base/share/classes/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java +++ b/src/java.base/share/classes/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java @@ -369,14 +369,19 @@ public abstract class AbstractQueuedLongSynchronizer } else if (node.status == 0) { node.status = WAITING; // enable signal and recheck } else { - long nanos; spins = postSpins = (byte)((postSpins << 1) | 1); - if (!timed) - LockSupport.park(this); - else if ((nanos = time - System.nanoTime()) > 0L) - LockSupport.parkNanos(this, nanos); - else - break; + try { + long nanos; + if (!timed) + LockSupport.park(this); + else if ((nanos = time - System.nanoTime()) > 0L) + LockSupport.parkNanos(this, nanos); + else + break; + } catch (Error | RuntimeException ex) { + cancelAcquire(node, interrupted, interruptible); // cancel & rethrow + throw ex; + } node.clearStatus(); if ((interrupted |= Thread.interrupted()) && interruptible) break; diff --git a/src/java.base/share/classes/java/util/concurrent/locks/AbstractQueuedSynchronizer.java b/src/java.base/share/classes/java/util/concurrent/locks/AbstractQueuedSynchronizer.java index 1f51419f94c..2ea0d3ed3b0 100644 --- a/src/java.base/share/classes/java/util/concurrent/locks/AbstractQueuedSynchronizer.java +++ b/src/java.base/share/classes/java/util/concurrent/locks/AbstractQueuedSynchronizer.java @@ -748,14 +748,19 @@ public abstract class AbstractQueuedSynchronizer } else if (node.status == 0) { node.status = WAITING; // enable signal and recheck } else { - long nanos; spins = postSpins = (byte)((postSpins << 1) | 1); - if (!timed) - LockSupport.park(this); - else if ((nanos = time - System.nanoTime()) > 0L) - LockSupport.parkNanos(this, nanos); - else - break; + try { + long nanos; + if (!timed) + LockSupport.park(this); + else if ((nanos = time - System.nanoTime()) > 0L) + LockSupport.parkNanos(this, nanos); + else + break; + } catch (Error | RuntimeException ex) { + cancelAcquire(node, interrupted, interruptible); // cancel & rethrow + throw ex; + } node.clearStatus(); if ((interrupted |= Thread.interrupted()) && interruptible) break;