# lazy-constants — Lazy Constants (JEP 531, third preview in JDK 27) Companion code for the ankurm.com article **Lazy Constants in JDK 27 (JEP 531): Replacing Double-Checked Locking**. The explanation lives in the article; this folder holds the runnable sources and the transcripts they produced. ```bash JDK25=/path/to/jdk-25 JDK26=/path/to/jdk-26 JDK27=/path/to/jdk-27 [JDK21=/path/to/jdk-21] ./run.sh # regenerates output/*.txt RUN_JMH=0 ./run.sh # skip the 3-minute benchmark ``` - `src/` — `OldWays` (holder idiom and double-checked locking, plain Java), `Basics`, `ToStringStates`, `Service`, `Failures`, `LazyCollections` (JDK 27, `--enable-preview`), `StableValue25` (the JDK 25 API). - `broken/` — code that fails to compile on purpose: the old `StableValue` name, the two methods removed in 27, no `--enable-preview`, a `set` that does not exist. - `jmh/` — a JMH 1.37 benchmark of the read path. `./jmh/fetch.sh` downloads the jars from Maven Central and checks their sha1; they are not committed. `./jmh/run-jmh.sh` writes `output/07-jmh.txt`. Everything except the JMH numbers is byte-stable. The JMH numbers are machine dependent: treat them as shape, not results. Tested on Temurin 25.0.4.1+1, 26.0.2.1+1 and 27+35, and OpenJDK 21.0.10 for the plain-Java baseline.