<div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div>This change is part of JEP 491[1], which was integrated[2] four days ago.</div><div><br></div><div>Glavo</div><div><br></div><div>[1]: <a href="https://openjdk.org/jeps/491">https://openjdk.org/jeps/491</a></div><div>[2]: <a href="https://github.com/openjdk/jdk/commit/78b80150e009745b8f28d36c3836f18ad0ca921f">https://github.com/openjdk/jdk/commit/78b80150e009745b8f28d36c3836f18ad0ca921f</a></div></div></div><blockquote style="margin:0px 0px 0px 40px;border:none;padding:0px"><div dir="ltr"><div dir="ltr"><div><br></div></div></div></blockquote><div dir="ltr"><div dir="ltr"><div><br></div></div></div></div></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sat, Nov 16, 2024 at 9:24 PM Dr Heinz M. Kabutz <<a href="mailto:heinz@javaspecialists.eu">heinz@javaspecialists.eu</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi,<br>
<br>
I was trying out Object.wait() on Java 24 to see what happens with <br>
virtual threads and it seems that it now works like ReentrantLock, but <br>
without resorting to ManagedBlockers.<br>
<br>
This code would not print anything prior to Java 24, but works fine now:<br>
<br>
<br>
import java.util.concurrent.*;<br>
import java.util.concurrent.atomic.*;<br>
<br>
public class ManyWaitingThreads {<br>
     public static void main(String... args) throws InterruptedException {<br>
         var counter = new AtomicInteger();<br>
         var builder = Thread.ofVirtual();<br>
         for (int i = 0; i < 100_000; i++) {<br>
             builder.start(() -> {<br>
                 synchronized (ManyWaitingThreads.class) {<br>
                     try {<br>
                         counter.incrementAndGet();<br>
                         ManyWaitingThreads.class.wait();<br>
                     } catch (InterruptedException e) {<br>
                         throw new CancellationException("interrupted");<br>
                     }<br>
                 }<br>
             });<br>
         }<br>
         builder.start(() -> System.out.println("All threads waiting"));<br>
         while(counter.get() < 100_000) Thread.yield();<br>
         synchronized (ManyWaitingThreads.class) {<br>
             ManyWaitingThreads.class.notifyAll();<br>
         }<br>
     }<br>
}<br>
<br>
I seemed to have missed this new change, but it is very welcome. Thanks <br>
for all your hard work.<br>
<br>
Regards<br>
<br>
Heinz<br>
-- <br>
Dr Heinz M. Kabutz (PhD CompSci)<br>
Author of "The Java™ Specialists' Newsletter" - <a href="http://www.javaspecialists.eu" rel="noreferrer" target="_blank">www.javaspecialists.eu</a><br>
Java Champion - <a href="http://www.javachampions.org" rel="noreferrer" target="_blank">www.javachampions.org</a><br>
JavaOne Rock Star Speaker<br>
Tel: +30 69 75 595 262<br>
Skype: kabutz<br>
<br>
</blockquote></div>