代码对比
✕ Java 8
private volatile Logger logger;
Logger getLogger() {
if (logger == null) {
synchronized (this) {
if (logger == null)
logger = createLogger();
}
}
return logger;
}
✓ Java 25 (Preview)
private final StableValue<Logger> logger =
StableValue.of(this::createLogger);
Logger getLogger() {
return logger.get();
}
发现此代码有问题? 告诉我们。
为什么现代方式更好
零样板代码
无 volatile、synchronized 或 null 检查。
JVM 优化
JVM 可以将稳定值常量折叠,就像 final 字段一样。
线程安全
保证只初始化一次,不存在竞态条件。
旧方式
双重检查锁定
现代方式
StableValue
自 JDK
25
难度
高级
JDK 支持
稳定值
预览
JDK 25 预览版(JEP 502)。需要 --enable-preview。
工作原理
StableValue 提供内置线程安全的延迟初始化不可变值。JVM 知道该值只写入一次,可以进行更激进的优化,包括常量折叠。
相关文档