DirectBufferAllocTest fails after replacement of Thread.sleep() with Thread.onSpinWait()
David Holmes
david.holmes at oracle.com
Wed Jun 22 06:44:21 UTC 2022
On 21/06/2022 9:35 pm, Сергей Цыпанов wrote:
>> The takeaway from this exercise is that loops with sleeps can't always be replaced by loops that busy-wait.
>> Functionally the logic is the same, but you can't just ignore the concurrency aspects.
>
> Thanks for explanation!
>
>> Which indicates yielding is having a similar effect to sleeping - though I would expect it to be less pronounced.
>
> May I ask one last question about this: in general case when we don't care about particular wait time (like in j.n.Bits.reserveMemory())
> should I prefer Thread.yield() over both Thread.sleep() and Thread.onSpinWait() providing that Thread.sleep() is expensive
> and Thread.onSpinWait() might cause undesirable side effects?
Thread.yield() may also have "undesirable side-effects" as you have no
idea for how long the thread that yields will be off-cpu.
If you need to slow down the current thread and guarantee some other
thread has a chance to make progress then Thread.sleep is best.
Busy-waits/yields/onSpinWait should only be used to impose very brief
pauses on a thread that needs another thread to do something to enable
forward progress - e.g for spinlocks on multicore systems. Using them
when flow control is needed can be problematic as you found in this test.
Cheers,
David
-----
> Regards,
> Sergey Tsypanov
More information about the core-libs-dev
mailing list