RFR(S): 8222518: Remove unnecessary caching of Parker object in java.lang.Thread

Daniel D. Daugherty daniel.daugherty at oracle.com
Wed Apr 24 15:16:17 UTC 2019


On 4/24/19 3:12 AM, David Holmes wrote:
> Bug: https://bugs.openjdk.java.net/browse/JDK-8222518
> webrev: http://cr.openjdk.java.net/~dholmes/8222518/webrev/

src/hotspot/share/classfile/javaClasses.cpp
     L1629:   macro(_park_blocker_offset,  k, "parkBlocker", 
object_signature, false);
         Line ends with a ';' and the previous last line did not. When the
         THREAD_FIELDS_DO macro is called, it is already followed by a ';':

         L1635:   THREAD_FIELDS_DO(FIELD_COMPUTE_OFFSET);
         L1640:   THREAD_FIELDS_DO(FIELD_SERIALIZE_OFFSET);

src/hotspot/share/classfile/javaClasses.hpp
     No comments.

src/hotspot/share/prims/unsafe.cpp
     No comments.

src/java.base/share/classes/java/lang/Thread.java
     No comments.

Thumbs up.  I don't need to see another webrev if you choose to remove
the ';' on L1629.

Dan

>
> The original implementation of Unsafe.unpark simply extracted the 
> JavaThread reference from the java.lang.Thread oop and if non-null 
> extracted the Parker instance from it and invoked unpark. This was 
> racy however as the native JavaThread could terminate at any time and 
> deallocate the Parker.
>
> That logic was fixed by JDK-6271298 which used of combination of 
> type-stable-memory "event" objects for the Parker, along with use of 
> the Threads_lock to obtain the initial reference to the Parker (from a 
> JavaThread guaranteed to be alive), together with caching the native 
> Parker pointer in a field of java.lang.Thread. Even though the native 
> thread may have terminated the Parker was still valid (even if 
> associated with a different thread) and the unpark at worst was a 
> spurious wakeup for that other thread.
>
> When JDK-8167108 introduced Thread Safe-Memory-Reclaimation (SMR) the 
> logic was updated to always use the safe mechanism - we grab a 
> ThreadsListHandle then check the cached field, else lookup the native 
> thread to see if it is alive and locate the Parker instance that way.
> With SMR the caching of the Parker pointer no longer serves any 
> purpose - we no longer have a lock-free use-the-cache path versus a 
> lock-using populate-the-cache path. With SMR we've already"paid" for 
> the ability to ensure the native thread can't terminate regardless of 
> whether we lookup the field from the java.lang.Thread or the 
> JavaThread. So we can simplify the code and save a little footprint by 
> removing the cache from java.lang.Thread:
>
>     /*
>      * JVM-private state that persists after native thread termination.
>      */
>     private long nativeParkEventPointer;
>
> and the supporting code from unsafe.cpp and javaClass.*pp in the JVM.
>
> I considered restoring the fast-path use of the cache without recourse 
> to Thread-SMR but performance measurements failed to show any benefit 
> in doing. See bug report for details.
>
> Thanks,
> David



More information about the core-libs-dev mailing list