diff --git a/src/hotspot/share/gc/shared/owstTaskTerminator.cpp b/src/hotspot/share/gc/shared/owstTaskTerminator.cpp index cd6ebe7c80a..2856a998133 100644 --- a/src/hotspot/share/gc/shared/owstTaskTerminator.cpp +++ b/src/hotspot/share/gc/shared/owstTaskTerminator.cpp @@ -65,6 +65,13 @@ bool OWSTTaskTerminator::offer_termination(TerminatorTerminator* terminator) { return true; } else { _blocker->lock_without_safepoint_check(); + // There is possibility that termination is reached between dropping the lock + // before returning from do_spin_master_work() and acquiring lock above. + if (_offered_termination == _n_threads) { + _blocker->unlock(); + assert(!peek_in_queue_set(), "Precondition"); + return true; + } } } else { _blocker->wait(true, WorkStealingSleepMillis);