[External] : Re: Ephemeral threads

Viktor Klang viktor.klang at oracle.com
Mon Jan 12 09:59:43 UTC 2026


In my example there is no queue. Are you suggesting that all 
pre-existing code and all new code should get rewritten using some new API?

On 2026-01-11 18:57, robert engels wrote:
> because if park wakes up, the thread already has a reference to the 
> queue meaning it can start another thread that puts items into the 
> queue.  Meaning the queue is not “unreferenceable”, so you can’t 
> simply destroy a thread waiting in park().
>
>> On Jan 11, 2026, at 10:30 AM, Viktor Klang <viktor.klang at oracle.com> 
>> wrote:
>>
>> 
>>
>> >This code is fundamentally broken. Park() can wake up for any reason.
>>
>> I don't see how "When park wakes up" (i.e. the temporal aspect) 
>> affects correctness in any way in the example given.
>>
>> >I suggest you look at ClosableQueue - it is correct and far easier 
>> to use.
>>
>> The example is completely devoid of any queuing concerns. We're 
>> talking about logic which is executed by some thread, and the person 
>> who writes the code does not strictly know whether that thread is a 
>> platform thread, a pooled platform thread, a virtual thread, an 
>> ephemeral virtual thread, a GC finalizer thread.
>>
>> In short, this is about: pre-existing code which may get executed by 
>> an ephemeral virtual thread may /silently/ leak resources under 
>> certain circumstances. Now, it can be argued that most of that code 
>> was "not ideal" in the first place, but the big difference is that 
>> when any such defect gets noticed in a running application, there's a 
>> much better visibility if the thread which ran into the problem is 
>> still there (evidence) vs not (no evidence).
>>
>> On 2026-01-11 01:50, Robert Engels wrote:
>>> This code is fundamentally broken. Park() can wake up for any reason.
>>>
>>> I suggest you look at ClosableQueue - it is correct and far easier 
>>> to use.
>>>
>>>> On Jan 10, 2026, at 6:03 PM, Viktor Klang <viktor.klang at oracle.com> 
>>>> wrote:
>>>>
>>>> 
>>>>
>>>> Hi Dmitry,
>>>>
>>>> An example can look like:
>>>>
>>>> void method() {
>>>>     long fileDescriptor = acquireFileDescriptor();
>>>>     LockSupport.park();
>>>>     releaseFileDescriptor(fileDescriptor);
>>>> }
>>>>
>>>> If an ephemeral VT executes that method, and there are no other 
>>>> references to that ephemeral VT, then at the point of park(), 
>>>> nothing can unpark it anymore, and it will then never release the 
>>>> file descriptor.
>>>>
>>>>
>>>> >We generally don’t allow try blocks (providing other constructs), 
>>>> we also very strongly discourage (just a drop short of disallowing) 
>>>> ANY threading primitives.
>>>>
>>>>
>>>> I don't see how that can work in practice, because it requires all 
>>>> users of your constructs to be familiar about exactly how all 
>>>> third-party logic (including JDK classes) are implemented under the 
>>>> hood. Perhaps I'm misunderstanding?
>>>>
>>>> On 2026-01-09 17:27, Dmitry Zaslavsky wrote:
>>>>> Not sure what you mean by native resources?
>>>>> Do you mean what people would use like try resources?
>>>>> We generally don’t allow try blocks (providing other constructs), we also very strongly discourage (just a drop short of disallowing) ANY threading primitives.
>>>>>
>>>>> Which makes me think that there is a better way to express my point from before.
>>>>> I think there is actually a common pattern here.
>>>>>
>>>>> We use VT inside of the lib. We don’t want users to actually use any threads all.
>>>>> I think it’s a goal of Alex as well.
>>>>> We use VT as  a way to avoid using threads (if that makes sense).
>>>>>
>>>>> I think ScopedTasks is going in the same direction. Ideally user just doesn’t know there are threads.
>>>>> We use Scala (appealing to Victor ;)) vals and immutable collections is the norm.
>>>>>
>>>>> We don’t want users to think about Threads period.
>>>>> So the thought of "GC roots on a VT … we don’t want that though to ever occur or we failed ;)
>>>>>
>>>>>
>>>>>
>>>>>   
>>>>>
>>>>>> On Jan 9, 2026, at 10:26 AM, Viktor Klang<viktor.klang at oracle.com> wrote:
>>>>>>
>>>>>>
>>>>>> On 2026-01-09 15:39, Dmitry Zaslavsky wrote:
>>>>>>> someCollection.apar.map { …. }
>>>>>>> Can spin N tasks (Each can get it's VT) If some iteration of the loop throws, we don’t need to rest of the code to run, it’s costly.
>>>>>>> If the task are not actively mounted but previously started and are waiting… (in our case it’s LockSupport.park) we just want to drop that entire queue and everything around it….
>>>>>>>
>>>>>>>
>>>>>> How do you handle acquired native resources that are yet to be released?
>>>>>>
>>>>>>
>>>>>> -- 
>>>>>> Cheers,
>>>>>>>>>>>>
>>>>>>
>>>>>> Viktor Klang
>>>>>> Software Architect, Java Platform Group
>>>>>> Oracle
>>>>>>
>>>> -- 
>>>> Cheers,
>>>>>>>>
>>>>
>>>> Viktor Klang
>>>> Software Architect, Java Platform Group
>>>> Oracle
>> -- 
>> Cheers,
>>>>
>>
>> Viktor Klang
>> Software Architect, Java Platform Group
>> Oracle

-- 
Cheers,
√


Viktor Klang
Software Architect, Java Platform Group
Oracle
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://mail.openjdk.org/pipermail/loom-dev/attachments/20260112/d1799845/attachment.htm>


More information about the loom-dev mailing list