From 4f6857d46a48748eb5cc9d0c43ecb9fc055a46d9 Mon Sep 17 00:00:00 2001 From: Alex Miller Date: Sat, 21 Oct 2023 14:00:45 -0500 Subject: [PATCH] update release notes --- content/news/2023/10/20/clojure-1-12-alpha5.doc | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/content/news/2023/10/20/clojure-1-12-alpha5.doc b/content/news/2023/10/20/clojure-1-12-alpha5.doc index 593a46ff..9a3bd875 100644 --- a/content/news/2023/10/20/clojure-1-12-alpha5.doc +++ b/content/news/2023/10/20/clojure-1-12-alpha5.doc @@ -5,9 +5,6 @@ Alex Miller Clojure 1.12.0-alpha5 is now available and we encourage you to try it and give us your feedback! -== Avoid user code with I/O under synchronized blocks - -Java 21 LTS introduced virtual threads (aka Project Loom). Virtual threads may be paused and resumed and cooperate with many blocking operations in the JDK - I/O, ReentrantLock, etc. However, Java 21 does not allow pausing of synchronization on object monitors (synchronized) and will thus "pin" the virtual thread to a carrier thread if blocking while synchronized. - -This release modifies `lazy-seq` and `delay` to use ReentrantLock instead of synchronized to avoid this issue. +== Use locks instead of synchronized blocks around user code in lazy-seq and delay +Clojure users want to use virtual threads on JDK 21. Prior to 1.12, Clojure lazy-seqs and delays, in order to enforce run-once behavior, ran user code under synchronized blocks, which don't participate in cooperative blocking. Thus if that code did e.g. blocking I/O it would pin a real thread. JDK 21 may emit the following warning for this . To avoid this pinning, in 1.12 we've changed lazy-seqs and delay to use locks instead of synchronized blocks.