{
 "date": "2026-10-25",
 "timezone": "Asia/Shanghai",
 "issue": 45,
 "batch": "U08",
 "sourceTag": "OpenJDK jdk-17.0.12+7 (fixed mechanism source)",
 "environment": {
  "os": "macOS 26.7.1 (x86_64)",
  "architecture": "x86_64",
  "javaVersion": "java version \"17.0.12\" 2024-07-16 LTS\nJava(TM) SE Runtime Environment (build 17.0.12+8-LTS-286)",
  "javaHome": "/Library/Java/JavaVirtualMachines/jdk-17.jdk/Contents/Home",
  "runtimeNote": "与 U05/U06/U07 相同的本机 Oracle JDK 17.0.12+8（x86_64）。绿跑开始于 2026-10-24T18:37:25Z（北京时间 2026-10-25 02:37）。jstack 死锁检测子进程复用同一 JDK 的 java.home/bin/jstack，自附加本机实测可用。",
  "runPolicy": "每次运行由包装脚本设置 90 秒 perl alarm 上限、-Xmx256m、唯一 TMPDIR 并作为 java.io.tmpdir 传入；结束后检查私有目录剩余条目（实测 0）并定向删除。run.sh 自身 mktemp 唯一编译目录 + EXIT/INT/TERM trap。探针所有线程等待/join 均有上限（最长 10 秒 join、6 秒 tryLock、5 秒闩锁），死锁线程全部 tryLock(6s) 限时兜底且有闸门固定持有窗口，无杀进程依赖。",
  "stderrNote": "stderr 中『注: TypeProbe.java 使用了未经检查或不安全的操作』来自 run.sh sync 编译阶段同目录既有 TypeProbe.java（run.sh 固定编译列表），非本票输出错误；『Picked up JAVA_TOOL_OPTIONS』是 JVM 对显式内存/临时目录限制的回显。"
 },
 "tdd": {
  "redGreen": [
   "红1（Semaphore release 误解断言，2026-10-24T18:21Z 前后）：按常见误解写下断言『许可 release 后回到初始值——worker 归还一个、main 归还自己那枚，availablePermits 应为 1』（/tmp/u08-red/LocksProbeRed.java red1），实跑 RED1 availablePermits=2，AssertionError: RED1 expected 1 (release restores initial), got 2，exit 1——release 是加一不是复原，额外 release 扩容许可；修正断言为『涨到 2』后绿跑 exit 0。正文按『扩容而非复原』口径撰写。",
   "红2（公平 tryLock 误解断言，2026-10-24T18:22Z 前后）：按『公平锁上无时限 tryLock 也应排队』的误解写下断言（red2：主线程持公平锁、W 已排队，主线程 unlock 后立即 tryLock 应返回 false），实跑 RED2 fair untimed tryLock after release acquired=true waiterDone=false，AssertionError: expected tryLock to respect fairness (false), got true (barged)，exit 1——JDK 17 的 Sync.tryLock() 恒为非公平实现（『Performs non-fair tryLock』），与锁的公平策略无关；修正为观察 3 轮中至少 1 轮插队（实测 3/3）。",
   "红3（barrier 超时传染误解断言，2026-10-24T18:23Z 前后）：按『超时只影响超时者自己』的误解写下断言（red3：A 无限时 await、B 超时后，A 应仍在等待），实跑发现 A 根本没等到超时传染——A 正常 trip（outcome=AssertionError: A tripped，exit 0 表示断言『A 仍在等』被推翻的方式不同）：首版场景把 parties 设为 2，超时方 B 恰是第二方，屏障凑齐正常放行，场景本身错了。这是实验场景设计红（真实发生，如实记录）：修正为 parties=3（第三方永不到达），Red3Fixed 实测 A=BrokenBarrierException、B=TimeoutException，『超时传染全员』才被真正验证；绿探针按修正场景断言。"
  ],
  "compileFixes": "开发中若干轮编译/设计修复如实记录不计红绿：恢复版丢失唤醒实验首版复用上一场景残留队列元素拿到 1 而非 7（改为独立锁与清空队列）；公平 tryLock 首版嵌套 try/finally 双重 unlock 抛 IMSE（重排释放）；死锁实验首版双方仅以闩锁同步『已持有』，快线程可先完成整轮再释放，环从未闭合、findDeadlockedThreads 实测 0/5 次（加 go 闸门并校验双锁 isLocked 后打开，闸门后 6/6 次稳定检出）；同实验首版断言『双方都必须超时』被实测推翻——一方超时释放后另一方的限时等待会直接成功（timeouts=1 合法），修正为『至少一次超时+双方恢复』；Phaser 注销段首版期望 arriveAndAwaitAdvance 返回 0，实测 1（最后一方返回 nextPhase，固定源码 return nextPhase），修正断言与注释。",
  "noFakeRed": "三个红均为先写下的真实预期（两个 API 误解 + 一个场景设计错误）被实测推翻，随后按源码/规范或修正场景后转绿，不倒造 red。"
 },
 "runs": [
  {
   "name": "sync-final",
   "command": [
    "bash",
    "labs/java-senior/run.sh",
    "sync"
   ],
   "startedUtc": "2026-10-24T18:37:25+00:00",
   "timeoutSeconds": 90,
   "timedOut": false,
   "exit": 0,
   "stdout": "java.version=17.0.12 vm=Java HotSpot(TM) 64-Bit Server VM\n\n== 1. monitor identity and ownership ==\ndifferent objects independent=0ms; same object waited=253ms（同身份互斥、不同身份独立——观察值）\nwait() without holding monitor -> IllegalMonitorStateException\nnon-owner ReentrantLock.unlock() -> IllegalMonitorStateException\nPASS monitor identity and ownership branches\n\n== 2. lost wakeup: pinned interleaving and recovery ==\nlost wakeup: await waited full 800ms though signal already fired（信号无余额，谓词在锁外检查即丢失）\nrecovered: while-predicate inside lock consumed item=7 without waiting（谓词回锁内即恢复）\nsignal with one item woke exactly 1 of 2 consumers\nsignalAll after second item woke the remaining consumer\nPASS lost wakeup and signal/signalAll recovery\n\n== 3. fair vs nonfair: queue order and barging ==\nfair: 4 queued workers acquired in enqueue order [W1, W2, W3, W4]（断言：严格 FIFO）\nfair: main relock() after unlock queued behind workers（公平门 hasQueuedThreads/hasQueuedPredecessors）\nnonfair: main relock() barged ahead of queued waiter in 3/3 rounds（无守卫 CAS 允许插队——设计行为，观察值）\nfair untimed tryLock() barged ahead of queued waiter in 3/3 rounds（无时限 tryLock 恒为非公平实现，契约行为）\nPASS fair vs nonfair order/barging/tryLock contracts\n\n== 4. timed and interruptible acquisition ==\ntryLock(200ms) while held -> false after ~209ms, lock still held（超时不改变任何状态）\ninterrupt during tryLock(t,u) -> InterruptedException, lock not acquired\nlockInterruptibly exits with InterruptedException while lock remains held\nPASS timed and interruptible acquisition branches\n\n== 5. ReentrantReadWriteLock boundaries ==\nread-read concurrency peak=2（读读并行）\nread held: write.tryLock(150ms) -> false（读写互斥）\nwrite held: other thread write.tryLock(150ms) -> false（写写互斥）\ndowngrade: write->read->unlock(write) held read, data=42\nread x2 held: getReadHoldCount=2; upgrade write.tryLock(150ms) -> false（持读升级写被自己挡住；无时限即自死锁）\nPASS read-write boundaries\n\n== 6. StampedLock optimistic read and non-reentrancy ==\noptimistic stamp validate=false after concurrent write（版本失效）\npessimistic readLock re-read value=43（升级悲观读恢复）\nwrite held: tryWriteLock(150ms) -> stamp 0（非重入；无时限 writeLock() 即自死锁）\nPASS StampedLock optimistic/non-reentrant branches\n\n== 7. deadlock: detection via ThreadMXBean/jstack and recovery ==\nThreadMXBean.findDeadlockedThreads() -> 2 threads（持有-等待环检出，断言）\njstack: Found one Java-level deadlock: / ============================= / \"dl-T1\": /   waiting for ownable synchronizer 0x00000007ff68f088, (a java.util.concurrent.locks.ReentrantLock$NonfairSync), /   which is held by \"dl-T2\" /  / \"dl-T2\": /…（真实子进程输出）\ndeadlock window ended: timeouts=2（一方超时后另一方限时等待可能直接成功——两种收尾都合法）; both recovered=true（超时退避+固定顺序 A->B 重试恢复）\nPASS deadlock detection and bounded recovery\n\n== 8. CountDownLatch: one-shot gate ==\nawait(200ms) before zero -> false（超时返回值探针，不抛 TimeoutException）\nafter 2x countDown: await(2s)=true getCount=0; extra countDown -> no-op, still 0（归零不可重置）\nrepeated awaits on opened latch pass without consuming state\nPASS latch one-shot semantics\n\n== 9. CyclicBarrier: generations and broken propagation ==\ngeneration 1 tripped, indices sum=1（最后一方得 0）\nsame barrier tripped again for generation 2（代际自动重置，cyclic）\none party await(150ms) -> TimeoutException（该方超时）\nuntimed party got BrokenBarrierException（超时传染同代全员，断言）; isBroken=true\nafter reset() barrier reusable（重开新代，三方 trip）\nPASS barrier generation/broken/reset branches\n\n== 10. Semaphore: permits are not ownership ==\nmain acquired permit; worker tryAcquire(200ms) -> false\nworker (never acquired) released; availablePermits=1（跨线程归还是合法模式）\nextra release -> availablePermits=2（release 是加一不是复原：扩容；本节曾按『回到初始值』误解写过红断言，实测 2 后修正——见 evidence 红绿记录）\nPASS semaphore non-ownership semantics\n\n== 11. Phaser: phases, dynamic parties, termination ==\n3 parties arrived; phase 0 -> 1（动态 register 计入）\nonAdvance>=1 terminated: isTerminated=true, sync returns -2147483646（终止后同步方法返回负值）\narriveAndDeregister -> registered=1; remaining party tripped solo (last arriver returns next phase=1); at 0 parties default onAdvance terminated（注销到零即默认终止）\nPASS phaser phase/termination/deregistration branches\n\n== 12. Exchanger: pairwise rendezvous ==\ntwo threads exchanged values mutually（配对互取，配对 hb 建立即刻）\nexchange(200ms) without partner -> TimeoutException（只影响自己）\nPASS exchanger rendezvous and timeout\n\nALL U08 SECTIONS PASS\n",
   "stderrNote": "JAVA_TOOL_OPTIONS 回显与 TypeProbe unchecked 诊断，见 environment.stderrNote",
   "tmpLeft": 0,
   "stabilityNote": "终轮前同二进制连续 6 轮 exit=0 全绿（含闸门修正后的死锁段 6/6 稳定检出）；插队类观察（非公平 3/3、公平 tryLock 3/3）按轮记录不断言单轮必现。"
  },
  {
   "name": "unknown-mode",
   "command": [
    "bash",
    "labs/java-senior/run.sh",
    "nonsense"
   ],
   "exit": 2,
   "stdout": "",
   "note": "未知模式退出 2（用法串含 sync）"
  },
  {
   "name": "extra-arg",
   "command": [
    "bash",
    "labs/java-senior/run.sh",
    "sync",
    "extra"
   ],
   "exit": 2,
   "note": "参数过多退出 2"
  },
  {
   "name": "bad-java-home",
   "command": [
    "bash",
    "labs/java-senior/run.sh",
    "sync"
   ],
   "env": {
    "JAVA_HOME": "/bad/home"
   },
   "exit": 2,
   "note": "无效 JAVA_HOME 退出 2"
  },
  {
   "name": "jdk21-rejected",
   "command": [
    "bash",
    "labs/java-senior/run.sh",
    "sync"
   ],
   "env": {
    "JAVA_HOME": "/Library/Java/JavaVirtualMachines/jdk-21.jdk/Contents/Home"
   },
   "exit": 2,
   "note": "版本守卫拒绝 JDK21（java version 21.0.5），本入口固定 JDK17"
  },
  {
   "name": "all-final",
   "command": [
    "bash",
    "labs/java-senior/run.sh",
    "all"
   ],
   "startedUtc": "2026-10-24T18:37:36+00:00",
   "timeoutSeconds": 300,
   "timedOut": false,
   "exit": 0,
   "stdoutNote": "含 SeniorProbe locks/pool/async（历史探针原样通过）、AlgorithmProbe、TypeProbe+编译检查、ReflectionProbe、JmmProbe（U07）、LocksProbe（ALL U08 SECTIONS PASS 在列）、collections、library、io 全部正常结束",
   "tmpLeft": 0
  }
 ]
}