RFR: 8338383: Implement JEP 491: Synchronize Virtual Threads without Pinning
David Holmes
dholmes at openjdk.org
Wed Nov 6 17:40:12 UTC 2024
On Tue, 22 Oct 2024 11:52:46 GMT, Alan Bateman <alanb at openjdk.org> wrote:
>> src/java.base/share/classes/java/lang/VirtualThread.java line 115:
>>
>>> 113: * RUNNING -> WAITING // transitional state during wait on monitor
>>> 114: * WAITING -> WAITED // waiting on monitor
>>> 115: * WAITED -> BLOCKED // notified, waiting to be unblocked by monitor owner
>>
>> Waiting to re-enter the monitor?
>
> yes
Okay so should it say that?
>> src/java.base/share/classes/java/lang/VirtualThread.java line 178:
>>
>>> 176: // timed-wait support
>>> 177: private long waitTimeout;
>>> 178: private byte timedWaitNonce;
>>
>> Strange name - what does this mean?
>
> Sequence number, nouce, anything will work here as it's just to deal with the scenario where the timeout task for a previous wait may run concurrently with a subsequent wait.
Suggestion: `timedWaitCounter` ?
>> src/java.base/share/classes/java/lang/VirtualThread.java line 530:
>>
>>> 528: && carrier == Thread.currentCarrierThread();
>>> 529: carrier.setCurrentThread(carrier);
>>> 530: Thread.setCurrentLockId(this.threadId()); // keep lock ID of virtual thread
>>
>> I'm struggling to understand the different threads in play when this is called and what the method actual does to which threads. ??
>
> A virtual thread is mounted but doing a timed-park that requires temporarily switching to the identity of the carrier (identity = Therad.currentThread) when queuing the timer task. As mentioned in a reply to Axel, we are close to the point of removing this (nothing to do with object monitors of course, we've had the complexity with temporary transitions since JDK 19).
>
> More context here is that there isn't support yet for a carrier to own a monitor before a virtual thread is mounted, and same thing during these temporary transitions. If support for custom schedulers is exposed then that issue will need to be addressed as you don't want some entries on the lock stack owned by the carrier and the others by the mounted virtual thread. Patricio has mentioned inflating any held monitors before mount. There are a couple of efforts in this area going on now, all would need that issue fixed before anything is exposed.
Okay but ....
1. We have the current virtual thread
2. We have the current carrier for that virtual thread (which is iotself a java.alng.Thread object
3. We have Thread.setCurrentLockId which ... ? which thread does it update? And what does "current" refer to in the name?
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/21565#discussion_r1811937674
PR Review Comment: https://git.openjdk.org/jdk/pull/21565#discussion_r1811938604
PR Review Comment: https://git.openjdk.org/jdk/pull/21565#discussion_r1810615473
More information about the core-libs-dev
mailing list