--- old/src/share/vm/prims/unsafe.cpp 2016-10-25 10:40:09.140777503 +0200 +++ new/src/share/vm/prims/unsafe.cpp 2016-10-25 10:40:09.093777472 +0200 @@ -1289,9 +1289,12 @@ UNSAFE_ENTRY(void, Unsafe_Unpark(JNIEnv *env, jobject unsafe, jobject jthread)) UnsafeWrapper("Unsafe_Unpark"); Parker* p = NULL; + oop java_thread = NULL; + JavaThread* thr = NULL; if (jthread != NULL) { - oop java_thread = JNIHandles::resolve_non_null(jthread); + java_thread = JNIHandles::resolve_non_null(jthread); if (java_thread != NULL) { + thr = java_lang_Thread::thread(java_thread); jlong lp = java_lang_Thread::park_event(java_thread); if (lp != 0) { // This cast is OK even though the jlong might have been read @@ -1303,7 +1306,7 @@ MutexLocker mu(Threads_lock); java_thread = JNIHandles::resolve_non_null(jthread); if (java_thread != NULL) { - JavaThread* thr = java_lang_Thread::thread(java_thread); + thr = java_lang_Thread::thread(java_thread); if (thr != NULL) { p = thr->parker(); if (p != NULL) { // Bind to Java thread for next time. @@ -1314,14 +1317,14 @@ } } } - if (p != NULL) { + if (p != NULL && thr != NULL) { #ifndef USDT2 HS_DTRACE_PROBE1(hotspot, thread__unpark, p); #else /* USDT2 */ HOTSPOT_THREAD_UNPARK( (uintptr_t) p); #endif /* USDT2 */ - p->unpark(); + p->unpark(thr); } UNSAFE_END