On Fri, 17 Oct 2025 09:25:01 GMT, Per Minborg <[email protected]> wrote:
>> Implement JEP 526: Lazy Constants (Second Preview)
>>
>> The lazy list/map implementations are broken out from `ImmutableCollections`
>> to a separate class.
>>
>> The old benchmarks are not moved/renamed to allow comparison with previous
>> releases.
>>
>> `java.util.Optional` is updated so that its field is annotated with
>> `@Stable`. This is to allow `Optional` instances to be held in lazy
>> constants and still provide constant folding.
>
> Per Minborg has updated the pull request incrementally with one additional
> commit since the last revision:
>
> Update javadocs
src/java.base/share/classes/java/lang/LazyConstant.java line 101:
> 99: * {@linkplain Error}, that {@linkplain Throwable} is propagated to the
> caller, and the
> 100: * lazy constant remains uninitialized. In other words, upon an
> unsuccessful invocation of
> 101: * the computing function, neither a constant, the exception, nor the
> fact that
"In other words" I don't think this sentence adds much. I think it's better to
just drop it. The main thing to say is that if computing function is
unsuccessful, the lazy constant stays uninitialized (which we already said).
src/java.base/share/classes/java/lang/LazyConstant.java line 111:
> 109: * which are held by lazy constants:
> 110: *
> 111: * {@snippet lang = java:
If you wanted, you could reuse the `Component` class -- that one already has a
lazy constant field, so if you put the component itself in another lazy
constant field you have your composition example.
src/java.base/share/classes/java/lang/LazyConstant.java line 144:
> 142: *
> 143: * <h2 id="thread-safety">Thread Safety</h2>
> 144: * A lazy constant is guaranteed to be initialized atomically and at
> most once. If
We already mention some of these above:
"Furthermore, {@linkplain #get()} guarantees that, out of several threads
trying to
* invoke the computing function simultaneously, only one is ever selected for
* computation"
Maybe add a reference form that text to this section?
src/java.base/share/classes/java/lang/LazyConstant.java line 152:
> 150: * <p>
> 151: * The invocation of the computing function and the resulting
> initialization of
> 152: * the constant {@linkplain java.util.concurrent##MemoryVisibility
> <em>happens-before</em>}
Do you mean constant or content? I think the latter? E.g. when you initialize a
lazy constant, you safely publish its contents? (the lazy constant itself is
already published)
src/java.base/share/classes/java/lang/LazyConstant.java line 158:
> 156: * Thread interruption does not cancel the initialization of a lazy
> constant. In other
> 157: * words, if the computing thread is interrupted, {@code
> LazyConstant::get} doesn't clear
> 158: * the interrupted thread’s status, nor does it throw an
> InterruptedException.
Suggestion:
* the interrupted thread’s status, nor does it throw an {@code
InterruptedException}.
src/java.base/share/classes/java/lang/LazyConstant.java line 164:
> 162: *
> 163: * <h2 id="performance">Performance</h2>
> 164: * A lazy constant can never change after it has been initialized.
> Therefore,
The contents of a lazy constant can never change after the lazy constant has
been initialized (again, spell out things clearly)
src/java.base/share/classes/java/lang/LazyConstant.java line 166:
> 164: * A lazy constant can never change after it has been initialized.
> Therefore,
> 165: * a JVM implementation may, for an initialized lazy constant, elide all
> future reads
> 166: * of that lazy constant and instead directly use any constant that it
> has previously
"elide all future reads of that lazy constant's contents and instead use the
contents that has been previously observed"
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/27605#discussion_r2439091644
PR Review Comment: https://git.openjdk.org/jdk/pull/27605#discussion_r2439096445
PR Review Comment: https://git.openjdk.org/jdk/pull/27605#discussion_r2439102301
PR Review Comment: https://git.openjdk.org/jdk/pull/27605#discussion_r2439110166
PR Review Comment: https://git.openjdk.org/jdk/pull/27605#discussion_r2439114804
PR Review Comment: https://git.openjdk.org/jdk/pull/27605#discussion_r2439119542
PR Review Comment: https://git.openjdk.org/jdk/pull/27605#discussion_r2439124386