src/share/vm/services/threadService.cpp
Print this page
rev 4818 : 8016304: ThreadMXBean.getDeadlockedThreads reports bogus deadlocks on JDK 8
Reviewed-by:
@@ -325,12 +325,14 @@
waitingToLockBlocker = jt->current_park_blocker();
}
while (waitingToLockMonitor != NULL || waitingToLockBlocker != NULL) {
cycle->add_thread(currentThread);
if (waitingToLockMonitor != NULL) {
+ address currentOwner = (address)waitingToLockMonitor->owner();
+ if (currentOwner != NULL) {
currentThread = Threads::owning_thread_from_monitor_owner(
- (address)waitingToLockMonitor->owner(),
+ currentOwner,
false /* no locking needed */);
if (currentThread == NULL) {
// This function is called at a safepoint so the JavaThread
// that owns waitingToLockMonitor should be findable, but
// if it is not findable, then the previous currentThread is
@@ -347,10 +349,11 @@
}
last = cycle;
cycle = new DeadlockCycle();
break;
}
+ }
} else {
if (concurrent_locks) {
if (waitingToLockBlocker->is_a(SystemDictionary::abstract_ownable_synchronizer_klass())) {
oop threadObj = java_util_concurrent_locks_AbstractOwnableSynchronizer::get_owner_threadObj(waitingToLockBlocker);
currentThread = threadObj != NULL ? java_lang_Thread::thread(threadObj) : NULL;