Java 17 高级机制实验
从仓库根运行;无第三方依赖。机制源码固定 OpenJDK jdk-17.0.12+7,旧输出原样保留;U04 本轮运行使用 BellSoft Liberica JDK 17.0.19+11-LTS(Darwin 27.0.0 arm64),不将源码标签冒充运行版本。
# macOS示例;Linux等平台将JAVA_HOME设为本机实际安装目录。
JAVA_HOME=$(/usr/libexec/java_home -v 17) bash labs/java-senior/run.sh types
JAVA_HOME=$(/usr/libexec/java_home -v 17) bash labs/java-senior/run.sh reflect
JAVA_HOME=$(/usr/libexec/java_home -v 17) bash labs/java-senior/run.sh all入口允许 all/locks/pool/async/poolasync/jmm/sync/algorithms/types/reflect/collections/library/io,不传参等同all;未知模式、参数过多、JDK工具缺失和非JDK17退出2。macOS未设JAVA_HOME时通过java_home发现17,其他平台必须指定;不改全局JDK。脚本以唯一临时目录编译,EXIT/INT/TERM trap定向删除;TypeProbe创建的合成文件也在该目录内并在finally清理。SIGKILL无法运行trap,强制终止后仅清理该次明确目录,不批量删除共享临时路径。
SeniorProbe 中的 locks、pool、async 分别对应正文中的缓冲区/可中断获取、线程池接纳/静默拒绝、Future取消/超时实验(U09 后 pool/async 的语义权威与扩展实验入口改指 poolasync 模式,SeniorProbe 两组断言保留为历史证据)。所有等待有上限,finally 释放闩锁并关闭线程池。输出 PASS 是断言通过后的实际输出;它不是吞吐基准,也不证明任意调度下的整个应用正确。
核心输入与预期:容量1缓冲区传递1—1000,总和500500;core=1/max=2/queue=1,第四任务拒绝;DiscardPolicy静默拒绝的Future未终结;cancel(false)与orTimeout均不能保证底层计算没有副作用。正文的PoolProbe/AsyncProbe为实验名称,实际入口统一在SeniorProbe对应方法。
AlgorithmProbe 验证访问序 LRU 的读取/更新/淘汰,以及容量 3、速率 2/s 的令牌桶:冻结时钟下 64 个并发请求只通过 3 个,保留小数补充且空闲后不超过桶容量。这些原实验保持原范围,不以本票完成替代其所属内容票核查。
U04 的 types 模式实际执行:
| 输入 | 可观察输出/失败恢复 |
|---|---|
| 基本数值与引用参数 | 原对象quantity从1变2,参数重绑99不影响调用方,count仍1;null拆箱/数组错误类型写入被拒绝;int溢出与窄化、先拓宽、addExact拒绝 |
| equals/hash与不可变性 | 两个不同Key实例可互查;2.0/2.00在HashSet中2项、自然排序TreeSet中1项;SafeBox防御原列表突变,copyOf仍共享StringBuilder元素 |
| 泛型/字节码 | 原bridge/record浅不可变/raw延迟CCE断言保留;javap打印Child两个value入口 |
| TWR真实协议 | body+两个close失败,close-only失败,第二资源初始化失败,null跳过,按反序选择主异常/suppressed;新资源恢复成功;普通finally覆盖body为反例 |
| 真实本机文件输入 | 唯一目录内缺文件→IO异常,wrong→checked应用异常保留cause,0→非法数量,改为3→成功;自有文件定向清理 |
| 真实javac | PECS/typed-instanceof/effectively-final资源编译并运行0;6个反例逐个编译非0(不变性/extends写入/Object的泛型测试/泛型数组/未声明受检异常/重绑资源变量),外层正确识别后退出0 |
关闭失败由实现AutoCloseable的合成类确定注入,但TWR控制流、异常对象和javac均为真实JDK行为,不是手工模拟TWR、数据库或网络的成功/回滚。仅能证明给定输入在该版本下成立,不能证明性能、所有调度、Native Image、生产资源与外部副作用。
reflect 模式由 ReflectionProbe 验证注解/反射/代理机制,具体输入与限制见反射正文。U04本轮完整命令、环境、stdout/stderr、退出状态与限时/清理记录见实测证据。出现REJECT/unchecked诊断是故意的错误输入;若错误片段反而编译成功,入口退出非0,不能只看某一行PASS。
U05 的 collections 与 library 模式分别对应集合选择、视图与迭代并发契约正文、Lambda/Stream/Optional 正文、日期时间正文:collections 委托 labs/collections/run.sh(probe 输出另存其 out/collections-probe.txt),library 运行 StdLibraryProbe(函数式组合、真实 javac 捕获/受检反例、Stream 惰性与单次终止、收集器重复键/null、Optional 惰性、Instant 单位、月末截断、巴黎 gap/overlap、SMART/STRICT/Locale 解析)。U05 本轮运行版本为 Oracle JDK 17.0.12(x86_64,本机可用的 JDK17;U04 的 Liberica 17.0.19 在另机),完整命令、stdout/stderr、退出状态与 TDD 记录见实测证据。all 模式在末尾执行这两个模式,不替代其正文验收。
U06 的 io 模式运行 EncodingIoProbe,对应字符编码正文、序列化正文、流文件通道正文:String 层 REPLACE 与 Decoder 层 REPORT 的分层、非法/未知字符集名两类异常、孤立代理对经 UTF-8 退化为 ?、BOM 残留、序列化 magic/句柄回引自引用与共享引用身份、真实 javax.tools 编译六个 Compat 版本验证默认 SUID 形状哈希与显式 SUID 兼容/不兼容矩阵、writeObject/writeReplace/readResolve/Externalizable 四类钩子、JEP 290 过滤器深度与 !* 白名单收口、read 契约(短读/len0/EOF/available/基类吞异常返回值与正常短读无法区分)、BufferedInputStream mark 越过 8192 缓冲失效、readLine 剥离换行、包装流 close 幂等传播、Files copy/move/glob/walk、Buffer flip/compact/mark 状态机与 FileChannel 位置读写独立性。U06 运行版本同为 Oracle JDK 17.0.12(x86_64),完整命令、stdout/stderr、退出状态与红绿记录见实测证据。
U07 的 jmm 模式运行 JmmProbe,对应JMM 可见性正文、CAS 正文、并发容器写侧契约正文:无同步数据竞争的观察值与原子修正对照、普通/volatile 停止标志(普通读可能被 JIT 提升出循环,可能不复现并如实标注)、final 冻结(this 逸出期间读默认值、无同步发布下 final 仍保证而普通字段仅观察值)、CAS 重试成本与 LongAdder 分散计数、引用身份 ABA 栈损坏与版本戳拒绝、weakCompareAndSetPlain 重试收敛、lazySet release-acquire 配对、CHM 写侧失败分支(递归更新 IllegalStateException、映射函数异常映射不变、merge 返回 null 即删除、null 键值拒绝)、computeIfAbsent 同键串行化与异键并行(600ms 映射实测对照)、COW 每写全量复制/迭代快照/迭代器 UOE/addIfAbsent、CLQ FIFO/空分支/null 拒绝/size O(n) 计时。U07 运行版本为 Oracle JDK 17.0.12+8(x86_64,与 U05/U06 相同);--add-opens java.base/java.util.concurrent=ALL-UNNAMED 仅用于反射读取 CopyOnWriteArrayList 内部数组字段。竞争类输出为观察值非契约,断言只压在规范保证上;完整命令、退出状态与三次真实红绿记录见实测证据。
U08 的 sync 模式运行 LocksProbe,对应锁语义与公平性正文、AQS 与 Condition 正文、同步器正文:监视器身份与所有权拒绝(同身份互斥/不同身份独立、wait 与非持有者 unlock 双 IMSE)、闩锁钉住的确定性丢失唤醒与 while 回锁内恢复、signal/signalAll 唤醒数对照、公平锁严格 FIFO 与非公平/无时限 tryLock 插队(3 轮观察)、限时/中断获取失败不持锁、读写锁读读并行/读写写写互斥/降级顺序/持读升级被拒/读重入计数、StampedLock 乐观读 validate 失效与写非重入、死锁闭环(ThreadMXBean.findDeadlockedThreads 断言 + 同 JDK jstack 子进程真实输出 + tryLock 限时退避与固定顺序恢复)、CountDownLatch 一次性/超时探针/多余 countDown 无操作、CyclicBarrier 代际复用/一方超时传染 BrokenBarrierException/reset 重开、Semaphore 跨线程归还与额外 release 扩容(红绿修正点)、Phaser 动态注册/阶段推进/onAdvance 终止负返回/注销到零默认终止、Exchanger 配对互取与无伙伴超时。U08 运行版本为 Oracle JDK 17.0.12+8(x86_64);死锁线程全部 tryLock(6s) 限时兜底且有闸门固定持有窗口,无杀进程依赖;插队与耗时类输出为观察值非契约。完整命令、退出状态与三次真实红绿(额外记录一次实验场景设计红:parties=2 时超时方即第二方、屏障正常 trip 而非传染)记录见实测证据。
U09 的 poolasync 模式运行 PoolAsyncProbe,对应ThreadPoolExecutor 正文、FutureTask/CompletableFuture 正文、中断协议与上下文正文:shutdown 停止接纳但继续消费队列/新任务拒绝 vs shutdownNow 全量中断并搬走队列/不响应中断的任务存活并自行退出、execute 逃逸异常进 afterExecute 且 Worker 换线程重建 vs submit 异常被 FutureTask 捕获(钩子收到 null、线程保留、Future.get 抛 ExecutionException)、CallerRuns 运行中反压执行在调用者 vs 关闭后静默丢弃、DiscardOldest 丢队首留新任务(A/C/D 序)、allowCoreThreadTimeOut 缩到 0 与核心保留对照、keepAlive 不打断执行中任务、CF 依赖链同因传播/exceptionally 恢复/whenComplete 只观察/allOf 等全部/anyOf 首完成可为失败、orTimeout 异常完成与 completeOnTimeout 默认值完成(底层计算继续、迟到结果不回滚终态)、中断标志轮询退出/InterruptedException 清标志与恢复/interrupted() 读取并清除、cancel(true) 对不响应中断任务只赢得结果槽/协作任务即刻退出/CF.cancel 不中断执行线程(AsyncSupply 的 result 检查可跳过未启动任务——实验用闩锁钉住已启动)、ThreadLocal 池复用串请求与 finally remove、InheritableThreadLocal 只在创建时快照(对照新建线程可继承)、capture-restore 装饰器安装/恢复、ThreadLocalMap 弱键强值 stale entry 反射观察(需 --add-opens java.base/java.lang=ALL-UNNAMED,观察值非契约,访问被拒打 SKIP)。execute 逃逸异常按预期出现在 stderr(未捕获处理器打印),是 submit 静默对照的一部分而非错误。U09 运行版本为 Oracle JDK 17.0.12+8(x86_64);完整命令、退出状态与三次真实红绿记录见实测证据。