RFR: 8340830: Console.readLine() and Console.printf() are mutually blocking

Per Minborg pminborg at openjdk.org
Fri Jan 30 12:43:38 UTC 2026


On Thu, 29 Jan 2026 21:08:06 GMT, Naoto Sato <naoto at openjdk.org> wrote:

> Fixing an issue in Console where write is blocked if other thread is waiting to read, which is caused by unnecessary read/write locks. Removing those would solve the problem, as the read/write synchronization is performed at the StreamEn/Decoder level. One unrelated change is to refactor double-checked locking with LazyConstant.

src/java.base/share/classes/java/io/ProxyingConsole.java line 37:

> 35:  * provided with jdk.internal.io.JdkConsoleProvider.
> 36:  */
> 37: final class ProxyingConsole extends Console {

Would it make sense to make all the classes in this file records and/or value classes, as all the fields are `final`?

src/java.base/share/classes/java/io/ProxyingConsole.java line 40:

> 38:     private final JdkConsole delegate;
> 39:     private final LazyConstant<Reader> reader = LazyConstant.of(this::initReader);
> 40:     private final LazyConstant<PrintWriter> printWriter = LazyConstant.of(this::initPrintWriter);

Great to see `LazyConstant` replacing DCLs! I wonder if we should use an anonymous class here rather than a lambda to improve startup time? I've made that in some other places in the JDK. Something to think about.

src/java.base/share/classes/java/io/ProxyingConsole.java line 53:

> 51:     @Override
> 52:     public PrintWriter writer() {
> 53:         PrintWriter printWriter = this.printWriter;

So nice to get rid of such code segments!

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/29493#discussion_r2746083379
PR Review Comment: https://git.openjdk.org/jdk/pull/29493#discussion_r2746092237
PR Review Comment: https://git.openjdk.org/jdk/pull/29493#discussion_r2746098793


More information about the core-libs-dev mailing list