labs/modern-java:U12 现代 Java 演进与虚拟线程公开实验(U13 增量扩展)
本目录是 U12(现代 Java:records/sealed/模式匹配/虚拟线程/JEP 400 断层)与 U13(结构化并发预览轨道/每任务一线程取消/资源有界性等待侧)的公开实验入口,与 U04–U11 的 JDK17 单一入口(labs/java-senior、labs/jvm-senior、labs/gc)并存不互斥:本入口按模式使用三个 JDK——evolution 固定 JDK 17,virtual/bounded 需要 JDK 21,jep400 做 17/21 对照,structured 需要 JDK 21 与 23 各一套(同一预览 API 源码双档编译运行)。
入口与模式
实验代码bash
cd <仓库根>
# 显式指定 JDK(推荐;macOS 未设置时由 /usr/libexec/java_home 解析,注意可能解析到 GraalVM 17)
export JAVA_HOME17=/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home
export JAVA_HOME21=/Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home
export JAVA_HOME23=/Library/Java/JavaVirtualMachines/jdk-23.jdk/Contents/Home # structured 模式需要
bash labs/modern-java/run.sh evolution # JDK17 基线(U12):record/sealed/instanceof 模式/switch 表达式/文本块 + 7 个编译负例 + 双档边界对照
bash labs/modern-java/run.sh virtual # JDK21 基线(U12):调度器/pinning 两相对照/JFR pin 事件/限流容量/上下文/中断
bash labs/modern-java/run.sh jep400 # 双 JDK(U12):JEP 400 断层三档对照(17 平台推导 / 21 无条件 UTF-8 / 21+COMPAT)
bash labs/modern-java/run.sh structured # JDK21+23(U13):JEP 453 结构化并发预览 API 同源双档 + 取消传播 + anyOf 对照 + ScopedValue 继承 + 孵化模块编译负例
bash labs/modern-java/run.sh bounded # JDK21(U13):close 等待/升级、shutdownNow 无队列、cancel(false)/(true)、连接池替身有界等待与拒绝、构造成本观察
bash labs/modern-java/run.sh all # 上述全部未知模式、多余参数、模式与 JDK 不匹配(evolution 给 21 / virtual、bounded 给 17 / structured 给 17 或 21 兼任 23)统一退出 2。编译输出与运行临时文件只写入唯一 mktemp 目录,EXIT/INT/TERM trap 定向清理,java.io.tmpdir 同步指向该目录;仓库内不产生运行产物。调用方建议用 90–240 秒 perl alarm 上限包装(all 约 2–3 分钟)。
探针文件
| 文件 | JDK | 覆盖 |
|---|---|---|
ModernJavaProbe.java | 17(--release 17,无预览) | record 派生成员/紧凑构造器校验/反射契约/浅不可变复核、sealed permits 反射/non-sealed、instanceof 模式流作用域与 null 恒不匹配、switch 表达式箭头+yield+枚举穷举、文本块缩进剥离与 var 静态类型 |
VirtualThreadProbe.java | 21(--release 21) | main:每任务一线程、jdk.VirtualThreadPinned JFR 事件(显式 1ms 档)、Semaphore(10) 限流下固定池与虚拟线程同被下游钳制、无信号量对照 200 并发、ITL 构造时快照(每任务 vs 池)、ThreadLocal、sleep 中断延迟;`pin-child compensate |
PatternBoundary.java | 17 拒绝 / 21 通过 | record 模式 + sealed 穷举 switch(JEP 440/441 的 --release 边界) |
SequencedBoundary.java | 17 拒绝 / 21 通过 | SequencedCollection API(JEP 431 的 --release 边界) |
Jep400Probe.java | 17 与 21 各跑 | defaultCharset/file.encoding/native.encoding 与无 charset FileReader 对 UTF-8 文件的解码;COMPAT 档恢复 17 行为 |
版本与运行环境登记(2026-10-25)
- 运行 JDK:Oracle JDK 17.0.12+8-LTS-286(x86_64)与 Oracle JDK 21.0.5+9-LTS-239(x86_64),macOS 26.7.1。固定源码 tag:
jdk-17.0.12+7、jdk-21.0.5+9(与运行版本对应)。 - JDK 25 未安装:所有 Java 25 差异(JEP 502/505/506/507/511/512/513/514/520 等)按 JEP/规范推导并在正文标注「未实跑」。
jdk.tracePinnedThreads是 JDK 21 的观察通道(JEP 491 于 JDK 24 移除该属性并消除 synchronized pinning,正文按版本分界说明,本机未实跑 24/25)。- pinning 的默认
maxPoolSize=256补偿语义是本机观察 + JEP 444 文字互证:pinned 阻塞会触发 ForkJoinPool 补偿新 carrier,不会立即饿死调度器;饿死形态出现在补偿配额耗尽(本实验用maxPoolSize=1在受控条件下复现串行化)。carrier 数/耗时都是观察值非契约。 - 完整命令、stdout/stderr、退出状态、红绿记录见本批证据。