--- old/src/java.base/share/classes/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java 2021-01-05 09:11:36.188958994 -0800 +++ new/src/java.base/share/classes/java/util/concurrent/locks/AbstractQueuedLongSynchronizer.java 2021-01-05 09:11:35.684962943 -0800 @@ -40,6 +40,7 @@ import java.util.Date; import java.util.concurrent.TimeUnit; import java.util.concurrent.ForkJoinPool; +import java.util.concurrent.RejectedExecutionException; import jdk.internal.misc.Unsafe; /** @@ -1197,13 +1198,18 @@ ConditionNode node = new ConditionNode(); long savedState = enableWait(node); LockSupport.setCurrentBlocker(this); // for back-compatibility - boolean interrupted = false; + boolean interrupted = false, rejected = false; while (!canReacquire(node)) { if (Thread.interrupted()) interrupted = true; else if ((node.status & COND) != 0) { try { - ForkJoinPool.managedBlock(node); + if (rejected) + node.block(); + else + ForkJoinPool.managedBlock(node); + } catch (RejectedExecutionException ex) { + rejected = true; } catch (InterruptedException ie) { interrupted = true; } @@ -1236,14 +1242,19 @@ ConditionNode node = new ConditionNode(); long savedState = enableWait(node); LockSupport.setCurrentBlocker(this); // for back-compatibility - boolean interrupted = false, cancelled = false; + boolean interrupted = false, cancelled = false, rejected = false; while (!canReacquire(node)) { if (interrupted |= Thread.interrupted()) { if (cancelled = (node.getAndUnsetStatus(COND) & COND) != 0) break; // else interrupted after signal } else if ((node.status & COND) != 0) { try { - ForkJoinPool.managedBlock(node); + if (rejected) + node.block(); + else + ForkJoinPool.managedBlock(node); + } catch (RejectedExecutionException ex) { + rejected = true; } catch (InterruptedException ie) { interrupted = true; }