Prevent pinned CarrierThreads on JDK-21 while using Virtual Threads #4079
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
This PR replaces some of the synchronized() blocks with ReentrantLock equivalents to prevent pinned CarrierThreads when using JDK-21 Virtual Threads.
When a service instance is requested from a Virtual Thread and the service initialization runs a
native method
orforeign function
, the JVM Carrier Thread is pinned preventing the execution of other Virtual Threads. See the following trace logged by using the -Djdk.tracePinnedThreads=full command line argument to the java command:After replacing the
synchronized(monitor) {}
by theReentrantLock
the CarrierThread is no longer pinned and the JVM no longer logs the above Error message.See JDK related documentation