<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>《Java 并发编程·JUC 源码与容器》 · 全书目录与章节索引（50 篇） on PlumePHP</title><link>https://plumephp.com/posts/books/java%E5%B9%B6%E5%8F%91%E6%BA%90%E7%A0%81/</link><description>Recent content in 《Java 并发编程·JUC 源码与容器》 · 全书目录与章节索引（50 篇） on PlumePHP</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Wed, 28 Oct 2026 21:49:00 +0800</lastBuildDate><atom:link href="https://plumephp.com/posts/books/java%E5%B9%B6%E5%8F%91%E6%BA%90%E7%A0%81/index.xml" rel="self" type="application/rss+xml"/><item><title>《Java 并发编程·JUC 源码与容器》附录 B 源码阅读路径与调试技巧</title><link>https://plumephp.com/java-conc-juc-appendix-b-source-reading/</link><pubDate>Wed, 28 Oct 2026 21:49:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-appendix-b-source-reading/</guid><description>从 JDK 25 的 src.zip 解压开始，给出 AQS、ReentrantLock、ConcurrentHashMap、ThreadPoolExecutor、ForkJoinPool 的依赖阅读顺序；用四组本机 javap 输出说明该看什么，再用 --add-opens 反射、jstack、jcmd 线程转储与 JFR 对齐源码字段与运行态。</description></item><item><title>《Java 并发编程·JUC 源码与容器》附录 A JUC 类图与选型表</title><link>https://plumephp.com/java-conc-juc-appendix-a-classmap/</link><pubDate>Wed, 28 Oct 2026 21:48:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-appendix-a-classmap/</guid><description>把本卷涉及的 62 个 java.util.concurrent 类型按锁与同步器、并发容器、阻塞队列、原子类、执行器、异步编排六类摊开，逐类给一句话定位与对应章节；用 ASCII 分类树和有序性、读写比例、迭代语义、容量语义、内存放大、能否阻塞六个维度的选型表，最后落到借阅系统的具体选型。</description></item><item><title>《Java 并发编程·JUC 源码与容器》15.3 JUC 误用清单与 Code Review</title><link>https://plumephp.com/java-conc-juc-15-3-review-checklist/</link><pubDate>Wed, 28 Oct 2026 21:47:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-15-3-review-checklist/</guid><description>把前十四章的结论压成 20 条可执行的检查项，按数据错误、死锁、性能、可维护性分级，每条给出症状、正确做法和对应章节；再配一个能在仓库里跑的 grep 扫描脚本、CI 闸门和一条 P0 的完整评审样例，贴出脚本在示例代码上的真实输出与它扫不出来的七件事。</description></item><item><title>《Java 并发编程·JUC 源码与容器》15.2 线程安全类的组合不安全</title><link>https://plumephp.com/java-conc-juc-15-2-composition-unsafe/</link><pubDate>Wed, 28 Oct 2026 21:46:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-15-2-composition-unsafe/</guid><description>线程安全的容器只保证单个方法原子，不保证两次调用之间不被插入。本节用 ConcurrentHashMap 的「先查后改」复现库存超卖，贴出 12 次运行的真实超卖数与 compute 修复后的零超卖，再说明 compute 的桶锁边界、synchronizedMap 的复合操作、弱一致迭代与快速失败的区别。</description></item><item><title>《Java 并发编程·JUC 源码与容器》15.1 双重检查锁定的正确写法</title><link>https://plumephp.com/java-conc-juc-15-1-dcl/</link><pubDate>Wed, 28 Oct 2026 21:45:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-15-1-dcl/</guid><description>用 javap 把 new 拆成分配、构造、发布三步，说清双重检查锁定为什么字段必须 volatile、它挡的是哪条重排；再给出 VarHandle 的 acquire/release 版本、静态持有者的单条 getstatic 与枚举的反射边界，并用一个 this 逃逸的构造稳定复现未初始化对象被发布。</description></item><item><title>《Java 并发编程·JUC 源码与容器》14.3 并发限流与信号量池</title><link>https://plumephp.com/java-conc-juc-14-3-semaphore-pool/</link><pubDate>Wed, 28 Oct 2026 21:44:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-14-3-semaphore-pool/</guid><description>用 Semaphore 加租约表实现有界资源池，靠 availablePermits 与持有时间两条线索抓出忘记 release 的泄漏；对照公平与非公平的排队延迟，用 reducePermits 做动态缩容，并说清令牌桶限速率、信号量桶限并发的区别。</description></item><item><title>《Java 并发编程·JUC 源码与容器》14.2 批量聚合与背压</title><link>https://plumephp.com/java-conc-juc-14-2-batch-backpressure/</link><pubDate>Wed, 28 Oct 2026 21:43:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-14-2-batch-backpressure/</guid><description>用数量阈值加时间阈值做批量窗口，用 drainTo 一次持锁取走整批并唤醒阻塞的生产者；再用有界队列和 CallerRunsPolicy 演示背压的真实形状：40 条里 7 条被拒、调用线程亲自执行任务，并给出批量失败后的二分重投边界与幂等前提。</description></item><item><title>《Java 并发编程·JUC 源码与容器》14.1 超时、重试与熔断的并发实现</title><link>https://plumephp.com/java-conc-juc-14-1-timeout-retry/</link><pubDate>Wed, 28 Oct 2026 21:42:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-14-1-timeout-retry/</guid><description>用 System.nanoTime 算剩余预算，把单次超时与指数退避都裁剪到预算之内；用 JDK 25 的 orTimeout 源码说明它为什么不取消底层任务；用 AtomicReference 加 AtomicLong 实现 closed/open/half-open 三态熔断，并贴出本机真实的状态迁移日志与预算消耗。</description></item><item><title>《Java 并发编程·JUC 源码与容器》13.3 异常传播与取消</title><link>https://plumephp.com/java-conc-juc-13-3-exception-cancel/</link><pubDate>Wed, 28 Oct 2026 21:41:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-13-3-exception-cancel/</guid><description>异常为什么被包装成 AltResult 而不是单独存一个字段？join 抛 CompletionException、get 抛 ExecutionException，这条边界在源码里画在哪？本节从 encodeThrowable、encodeRelay 讲到 cancel 与 orTimeout，并用异常链实验说明回调里拿到的异常类型为什么不一致。</description></item><item><title>《Java 并发编程·JUC 源码与容器》13.2 异步任务的执行器选择</title><link>https://plumephp.com/java-conc-juc-13-2-executor-choice/</link><pubDate>Wed, 28 Oct 2026 21:40:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-13-2-executor-choice/</guid><description>thenApplyAsync 不传执行器时落到哪个池？为什么 thenApply 不一定在完成者的线程上跑？本节拆开 ASYNC_POOL 与 commonPool 的关系、SYNC/ASYNC/NESTED 三档模式，用自定义执行器与占满并行度的实验说明阻塞调用为什么会卡住整条链。</description></item><item><title>《Java 并发编程·JUC 源码与容器》13.1 CompletableFuture 的依赖栈</title><link>https://plumephp.com/java-conc-juc-13-1-dependency-stack/</link><pubDate>Wed, 28 Oct 2026 21:39:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-13-1-dependency-stack/</guid><description>thenApply 返回的 future 没有线程在等它，为什么 complete 一调用整条链就醒了？本节从 result 与 stack 两个 volatile 字段入手，拆解 Treiber 栈的压栈与倒栈、NESTED 模式的迭代展开，并用反射读出真实链上的 UniApply、UniCompose、UniRelay、CoCompletion。</description></item><item><title>《Java 并发编程·JUC 源码与容器》12.3 并行流的拆分策略</title><link>https://plumephp.com/java-conc-juc-12-3-parallel-split/</link><pubDate>Wed, 28 Oct 2026 21:38:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-12-3-parallel-split/</guid><description>并行流的性能由拆分决定：Spliterator 的 trySplit/estimateSize/characteristics 三个契约，AbstractTask 与 CountedCompleter 的循环式拆分、LEAF_TARGET 与目标叶大小，commonPool 固定并行度的代价；附本机拆分次数、栈溢出与阻塞任务实测，以及自定义 Spliterator 的两版求和。</description></item><item><title>《Java 并发编程·JUC 源码与容器》12.2 双向队列与 steal 竞争</title><link>https://plumephp.com/java-conc-juc-12-2-steal-competition/</link><pubDate>Wed, 28 Oct 2026 21:37:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-12-2-steal-competition/</guid><description>JDK 25 的 WorkQueue 两端为什么会在同一格上撞：poll() 的 CAS 路径、base 一致性检查与 onSpinWait 的停滞判断，phase 如何用 IDLE 位同时充当提交队列的 seqlock 与版本号，nsteals 与 getStealCount 的统计口径，附本机字节码、phase 原始值和高并发窃取失败率数据。</description></item><item><title>《Java 并发编程·JUC 源码与容器》12.1 工作窃取队列与任务扫描</title><link>https://plumephp.com/java-conc-juc-12-1-steal-queue/</link><pubDate>Wed, 28 Oct 2026 21:36:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-12-1-steal-queue/</guid><description>拆开 JDK 25 的 ForkJoinPool$WorkQueue：base/top/array/config/phase 五个字段的职责，owner 走 nextLocalTask(fifo)、窃取者走 poll()，pollScan 的随机起点与 submissionsOnly，以及 getSurplusQueuedTaskCount 为何能压低窃取；附本机 javap 与对照实验。</description></item><item><title>《Java 并发编程·JUC 源码与容器》11.3 DelayedWorkQueue</title><link>https://plumephp.com/java-conc-juc-11-3-delayed-workqueue/</link><pubDate>Wed, 28 Oct 2026 21:35:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-11-3-delayed-workqueue/</guid><description>DelayedWorkQueue 用数组堆加 heapIndex 反查实现 O(log n) 取消，用 leader 与 available 保证同一时刻只有一个线程带超时等待。本节逐分支拆 take()，用四个 worker 等一个到期任务的本机输出证明只有 leader 被唤醒，并对比 DelayQueue 的容量与删除代价。</description></item><item><title>《Java 并发编程·JUC 源码与容器》11.2 addWorker、runWorker 与退出</title><link>https://plumephp.com/java-conc-juc-11-2-addworker-runworker/</link><pubDate>Wed, 28 Oct 2026 21:34:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-11-2-addworker-runworker/</guid><description>一个任务如何变成一个新线程、线程如何取任务又如何退出。本节拆 addWorker 的抢名额与回滚、runWorker 的 firstTask 加 getTask 循环，并用本机实测展示 ThreadFactory 返回 null 时任务被静默入队、beforeExecute 抛异常时任务不执行但 completedTaskCount 仍然加一。</description></item><item><title>《Java 并发编程·JUC 源码与容器》11.1 ctl 与 Worker 生命周期</title><link>https://plumephp.com/java-conc-juc-11-1-ctl-worker/</link><pubDate>Wed, 28 Oct 2026 21:33:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-11-1-ctl-worker/</guid><description>线程池把两个控制量压进一个 int：高 3 位是 runState，低 29 位是 workerCount。本节用反射读出运行中线程池的真实 ctl 并逐位拆解，解释 RUNNING 为什么取负数、五个状态为何只能单向递增，以及 Worker 为何继承 AQS 用 tryAcquire 表示正在跑任务。</description></item><item><title>《Java 并发编程·JUC 源码与容器》10.3 无锁 vs 有锁实测</title><link>https://plumephp.com/java-conc-juc-10-3-lockfree-benchmark/</link><pubDate>Wed, 28 Oct 2026 21:32:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-10-3-lockfree-benchmark/</guid><description>同一混合负载下用 JMH 对比 synchronized 栈、ReentrantLock 栈与 Treiber 栈，再用自写探针统计 CAS 失败次数与 p99/p999：4 线程时无锁吞吐只有有锁的五分之一，但 p999 反而低一个数量级。</description></item><item><title>《Java 并发编程·JUC 源码与容器》10.2 ABA 与内存回收</title><link>https://plumephp.com/java-conc-juc-10-2-aba-reclaim/</link><pubDate>Wed, 28 Oct 2026 21:31:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-10-2-aba-reclaim/</guid><description>把一次 pop 拆成读快照与提交两步，用单线程脚本稳定复现丢失更新；再拆 AtomicStampedReference 的 Pair 与 VarHandle PAIR，说明 Java 有 GC 为什么仍会逻辑 ABA，以及 AtomicMarkableReference 一个 bit 够用在哪、不够用在哪。</description></item><item><title>《Java 并发编程·JUC 源码与容器》10.1 无锁栈与 Michael-Scott 队列</title><link>https://plumephp.com/java-conc-juc-10-1-lockfree-queue/</link><pubDate>Wed, 28 Oct 2026 21:30:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-10-1-lockfree-queue/</guid><description>用 VarHandle 手写 Treiber 栈与 Michael-Scott 队列，实测一百万次入队中 tail 有一百零六万次不是真实末尾；再对照 ConcurrentLinkedQueue 的 MAX_HOPS、updateHead、succ 与 skipDeadNodes，说明它为什么要多一层帮助推进。</description></item><item><title>《Java 并发编程·JUC 源码与容器》9.3 用 VarHandle 替换 Unsafe</title><link>https://plumephp.com/java-conc-juc-09-3-replace-unsafe/</link><pubDate>Wed, 28 Oct 2026 21:29:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-09-3-replace-unsafe/</guid><description>梳理 JDK 25 中 Unsafe 到 VarHandle 的迁移路径：实例字段、静态字段、数组元素与字节数组视图四种句柄，lookup 访问权限与 final 字段限制，给出一张迁移对照表和库存扣减的迁移前后代码，并说明哪些能力 VarHandle 接不住。</description></item><item><title>《Java 并发编程·JUC 源码与容器》9.2 内存屏障与 acquire/release</title><link>https://plumephp.com/java-conc-juc-09-2-memory-ordering/</link><pubDate>Wed, 28 Oct 2026 21:28:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-09-2-memory-ordering/</guid><description>解释 getAcquire/setRelease 的单向屏障语义，用 JCStress 复现一个普通标志位的不安全发布并修好它，再用 Dekker 实验说明 acquire/release 为什么仍弱于 volatile，最后给出 fullFence 等五个屏障方法的适用边界。</description></item><item><title>《Java 并发编程·JUC 源码与容器》9.1 VarHandle 的访问模式</title><link>https://plumephp.com/java-conc-juc-09-1-varhandle-modes/</link><pubDate>Wed, 28 Oct 2026 21:27:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-09-1-varhandle-modes/</guid><description>从 JDK 25 源码拆解 VarHandle 的五种访问模式：plain、opaque、acquire/release、volatile 与 CAS 各自保证什么，用 JCStress 的 Dekker 实验展示 plain 与 volatile 的差距，并核对句柄获取与类型检查时机，最后落到库存扣减代码。</description></item><item><title>《Java 并发编程·JUC 源码与容器》8.3 Striped64 与高并发计数设计</title><link>https://plumephp.com/java-conc-juc-08-3-striped64/</link><pubDate>Wed, 28 Oct 2026 21:26:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-08-3-striped64/</guid><description>进入 LongAdder 的引擎 Striped64：探针哈希如何把线程映射到 Cell、cellsBusy 为什么是一把不阻塞的自旋锁、longAccumulate 的建槽/重试/扩容三分支，以及 JDK 25 用 SharedSecrets 桥接 ThreadLocalRandom 探针的原因与手写简化版实测。</description></item><item><title>《Java 并发编程·JUC 源码与容器》8.2 LongAdder 的 Cell 分片</title><link>https://plumephp.com/java-conc-juc-08-2-longadder-cells/</link><pubDate>Wed, 28 Oct 2026 21:25:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-08-2-longadder-cells/</guid><description>拆 LongAdder 的 base + cells 双层结构：@Contended 为什么让每个 Cell 约占 289 字节，sum() 为何不是快照（本机 158 万次采样有 24 万次把在借数算成负数），reset() 的破坏性，以及高竞争实测下它何时反而不如 AtomicLong。</description></item><item><title>《Java 并发编程·JUC 源码与容器》8.1 AtomicInteger 家族的 CAS 路径</title><link>https://plumephp.com/java-conc-juc-08-1-atomic-cas-path/</link><pubDate>Wed, 28 Oct 2026 21:24:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-08-1-atomic-cas-path/</guid><description>拆开 JDK 25 的 AtomicInteger：源码注释为何承认本该用 VarHandle 却仍走 jdk.internal.misc.Unsafe，getAndAddInt、putIntRelease、compareAndSetInt 各自的内存语义，weakCompareAndSet 与 compareAndSet 的实际差别，以及字段更新器的实现与本机字节码和重试数据。</description></item><item><title>《Java 并发编程·JUC 源码与容器》7.3 队列的锁粒度、吞吐与内存</title><link>https://plumephp.com/java-conc-juc-07-3-queue-throughput/</link><pubDate>Wed, 28 Oct 2026 21:23:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-07-3-queue-throughput/</guid><description>从锁拆分、Node 对象开销、伪共享与容量语义四个角度解释三种阻塞队列的吞吐差异，给出本机 JMH 与简易探针的真实输出、JOL 字段偏移与保留集数据，说明为什么这些数字只能看数量级、不能横向引用，并用 libraryd-conc 的容量与监控工具收尾。</description></item><item><title>《Java 并发编程·JUC 源码与容器》7.2 SynchronousQueue、Priority、Delay</title><link>https://plumephp.com/java-conc-juc-07-2-sync-priority-delay/</link><pubDate>Wed, 28 Oct 2026 21:22:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-07-2-sync-priority-delay/</guid><description>拆解 JDK 25 中已重构的 SynchronousQueue（Transferer 继承 LinkedTransferQueue）、PriorityBlockingQueue 的堆与 allocationSpinLock 扩容、DelayQueue 的 leader/available 协议，用零容量交接、同优先级出队、延迟到期三组实跑数据说明边界与代价。</description></item><item><title>《Java 并发编程·JUC 源码与容器》7.1 ArrayBlockingQueue 与 LinkedBlockingQueue</title><link>https://plumephp.com/java-conc-juc-07-1-abq-lbq/</link><pubDate>Wed, 28 Oct 2026 21:21:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-07-1-abq-lbq/</guid><description>从 JDK 25 源码对比 ArrayBlockingQueue 的单锁双条件与 LinkedBlockingQueue 的双锁双条件，解释 count 为何必须是 AtomicInteger、signalNotEmpty/signalNotFull 的精确唤醒判据，并用同构探针统计每次 put 的唤醒次数与 JMH 吞吐，给出 libraryd-conc 的有界事件队列落地与容量取舍。</description></item><item><title>《Java 并发编程·JUC 源码与容器》6.3 并发集合选型矩阵</title><link>https://plumephp.com/java-conc-juc-06-3-collection-matrix/</link><pubDate>Wed, 28 Oct 2026 21:20:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-06-3-collection-matrix/</guid><description>把 ConcurrentHashMap、跳表、写时复制与阻塞队列放进有序性、读写比例、迭代语义、内存放大四个维度的矩阵，给出可直接照做的决策树与五种常见误选，并用 libraryd-conc 的 ISBN 索引改造实测每次更新的分配量从 162684 字节降到约 570 字节。</description></item><item><title>《Java 并发编程·JUC 源码与容器》6.2 ConcurrentSkipListMap</title><link>https://plumephp.com/java-conc-juc-06-2-skiplistmap/</link><pubDate>Wed, 28 Oct 2026 21:19:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-06-2-skiplistmap/</guid><description>以 JDK 25 源码拆 ConcurrentSkipListMap：Index 三层指针为何取代了 HeadIndex 与 level 字段、doPut 如何先挂底层再补索引并重试，并用本机反射统计的层数、索引占比与读写数据回答为何有序并发容器选跳表。</description></item><item><title>《Java 并发编程·JUC 源码与容器》6.1 CopyOnWriteArrayList/Set</title><link>https://plumephp.com/java-conc-juc-06-1-copyonwrite/</link><pubDate>Wed, 28 Oct 2026 21:18:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-06-1-copyonwrite/</guid><description>以 JDK 25 源码拆开 CopyOnWriteArrayList 的写时复制：锁字段为何从 ReentrantLock 换成 Object 监视器、add 的复制路径、读为何无锁，并用本机分配计数给出每次写的字节数与 addIfAbsent 的比较次数。</description></item><item><title>《Java 并发编程·JUC 源码与容器》5.3 弱一致迭代与复合操作</title><link>https://plumephp.com/java-conc-juc-05-3-chm-weak-iteration/</link><pubDate>Wed, 28 Oct 2026 21:17:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-05-3-chm-weak-iteration/</guid><description>用本机实验说明 ConcurrentHashMap 迭代器的弱一致性：Traverser 如何跨新旧表、为什么不抛 ConcurrentModificationException，以及 compute/computeIfAbsent/merge 只锁单桶的原子性边界和递归更新导致的异常与跨 map 死锁。</description></item><item><title>《Java 并发编程·JUC 源码与容器》5.2 put/get 的并发路径与 size 统计</title><link>https://plumephp.com/java-conc-juc-05-2-chm-put-get/</link><pubDate>Wed, 28 Oct 2026 21:16:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-05-2-chm-put-get/</guid><description>沿 JDK 25 源码拆开 ConcurrentHashMap 的 get 与 putVal：无锁读、桶首 CAS、synchronized 锁桶首、MOVED 转发与 helpTransfer，再用探针展示 baseCount、CounterCell 分片计数和 sumCount 的近似性，附本机分支日志。</description></item><item><title>《Java 并发编程·JUC 源码与容器》5.1 ConcurrentHashMap 的节点结构</title><link>https://plumephp.com/java-conc-juc-05-1-chm-structure/</link><pubDate>Wed, 28 Oct 2026 21:15:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-05-1-chm-structure/</guid><description>从 JDK 25 的 javap 输出出发，逐个核对 ConcurrentHashMap 的 Node、TreeBin、ForwardingNode、ReservationNode 与 CounterCell 字段，解释 MOVED/TREEBIN/RESERVED 三种负 hash 与 sizeCtl 在初始化、阈值、扩容三种状态下的编码，并给出桶状态图和本机探针输出。</description></item><item><title>《Java 并发编程·JUC 源码与容器》4.3 Exchanger 与同步器组合</title><link>https://plumephp.com/java-conc-juc-04-3-exchanger-composition/</link><pubDate>Wed, 28 Oct 2026 21:14:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-04-3-exchanger-composition/</guid><description>拆开 Exchanger 的 Slot、Participant 与 arena，说明它为什么不用 AQS、0 号槽为何是唯一的阻塞点、配对与超时怎样收尾，再用双缓冲快照和两个信号量反序获取的真实死锁输出，收束本章，并指出这类死锁的检测盲区与组合风险。</description></item><item><title>《Java 并发编程·JUC 源码与容器》4.2 CountDownLatch、CyclicBarrier、Phaser</title><link>https://plumephp.com/java-conc-juc-04-2-latch-barrier-phaser/</link><pubDate>Wed, 28 Oct 2026 21:13:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-04-2-latch-barrier-phaser/</guid><description>对比 CountDownLatch 的一次性计数、CyclicBarrier 用锁加条件队列维护的“代”与 Phaser 的 long 位域拆分，再用同一份六分片加载场景的三种写法与真实输出，说明一次性、按代重用、按阶段推进各自的边界与选型取舍。</description></item><item><title>《Java 并发编程·JUC 源码与容器》4.1 Semaphore 与许可模型</title><link>https://plumephp.com/java-conc-juc-04-1-semaphore/</link><pubDate>Wed, 28 Oct 2026 21:12:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-04-1-semaphore/</guid><description>拆开 Semaphore 的 Sync，看许可如何直接复用 AQS 的 state、公平版为何只多一次排队检查、许可为负时 reducePermits 与 drainPermits 的欠账语义，再用下游通知扇出的限流实验验证并发上限确实收敛到 2。</description></item><item><title>《Java 并发编程·JUC 源码与容器》3.3 StampedLock 的乐观读</title><link>https://plumephp.com/java-conc-juc-03-3-stampedlock-optimistic/</link><pubDate>Wed, 28 Oct 2026 21:11:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-03-3-stampedlock-optimistic/</guid><description>StampedLock 用版本戳把读分成加锁读和乐观读两档。本节按 JDK 25 源码拆解 7 位读者计数、写位与版本位，实测 validate 的语义、不可重入与 tryConvertToWriteLock 的边界，并给出三版缓存的对照数据。</description></item><item><title>《Java 并发编程·JUC 源码与容器》3.2 锁降级与写锁饥饿</title><link>https://plumephp.com/java-conc-juc-03-2-downgrade-starvation/</link><pubDate>Wed, 28 Oct 2026 21:10:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-03-2-downgrade-starvation/</guid><description>锁降级为什么必须先拿读锁再放写锁，升级为什么会自死锁，非公平模式的两条插队规则各自把谁饿住。附锁降级示例、12 次写者等待分布，以及 96 次与数千次以上的插队计数对比，并说明 JDK 25 的 head-writer 启发式为什么让完整写饥饿难以复现。</description></item><item><title>《Java 并发编程·JUC 源码与容器》3.1 ReentrantReadWriteLock 的 state 拆分</title><link>https://plumephp.com/java-conc-juc-03-1-rrwl-state/</link><pubDate>Wed, 28 Oct 2026 21:09:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-03-1-rrwl-state/</guid><description>读写锁要把读者总数和写者重入数塞进同一个 state。本节按 JDK 25 源码核对 32/32 位布局、SHARED_UNIT 与 EXCLUSIVE_MASK 的位运算、HoldCounter 与 ThreadLocalHoldCounter 的分线程计数，并给出 javap 与反射探测的本机输出。</description></item><item><title>《Java 并发编程·JUC 源码与容器》2.3 锁的中断、超时与可重入</title><link>https://plumephp.com/java-conc-juc-02-3-interrupt-timeout/</link><pubDate>Wed, 28 Oct 2026 21:08:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-02-3-interrupt-timeout/</guid><description>lockInterruptibly 与 tryLock(timeout) 在 JDK 25 统一走 acquire 大循环，返回值区分成功、超时与中断；Thread.interrupted() 负责在 park 醒来时收走中断标志。实测中断耗时、250ms 超时返回 false 的时刻，并用反射把 state 推到 Integer.MAX_VALUE 验证重入溢出。</description></item><item><title>《Java 并发编程·JUC 源码与容器》2.2 Condition 的条件队列</title><link>https://plumephp.com/java-conc-juc-02-2-condition-queue/</link><pubDate>Wed, 28 Oct 2026 21:07:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-02-2-condition-queue/</guid><description>JDK 25 的 ConditionObject 用 ConditionNode 串起条件队列：await 先 enableWait 入队并释放全部重入次数，signal 只把节点 enqueue 到同步队列而不唤醒。用双条件 notEmpty/notFull 手写有界队列，并用实测时间线证明 signal 后线程仍在 park。</description></item><item><title>《Java 并发编程·JUC 源码与容器》2.1 ReentrantLock 的公平与非公平</title><link>https://plumephp.com/java-conc-juc-02-1-reentrantlock-fair/</link><pubDate>Wed, 28 Oct 2026 21:06:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-02-1-reentrantlock-fair/</guid><description>JDK 25 把公平与非公平逻辑收进 initialTryLock：非公平两次不看队列直接 CAS，公平先用 hasQueuedThreads 再用 hasQueuedPredecessors 拦插队。用 100 轮插队计数实验给出四组真实数据，并解释非公平为何吞吐更高、公平锁的 tryLock 为何仍然会插队。</description></item><item><title>《Java 并发编程·JUC 源码与容器》1.3 共享模式与传播机制</title><link>https://plumephp.com/java-conc-juc-01-3-shared-propagation/</link><pubDate>Wed, 28 Oct 2026 21:05:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-01-3-shared-propagation/</guid><description>解释 tryAcquireShared 三种返回值的语义，对照旧版 setHeadAndPropagate、doReleaseShared 与 PROPAGATE 状态的由来，再以 JDK 25 的 signalNextIfShared 为主线，用自写共享门和 CountDownLatch 验证传播链。</description></item><item><title>《Java 并发编程·JUC 源码与容器》1.2 独占模式的 acquire/release</title><link>https://plumephp.com/java-conc-juc-01-2-acquire-release/</link><pubDate>Wed, 28 Oct 2026 21:04:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-01-2-acquire-release/</guid><description>对照 JDK 8 与 JDK 25 两套实现，拆解独占模式从 tryAcquire 失败到入队、park、唤醒、取消的完整路径，用一个非重入互斥锁跑出四线程严格 FIFO 的获取与释放顺序，并给出可观测插队次数的 BargingMutex 落地实现。</description></item><item><title>《Java 并发编程·JUC 源码与容器》1.1 AQS 的 state 与 CLH 变体队列</title><link>https://plumephp.com/java-conc-juc-01-1-aqs-state-queue/</link><pubDate>Wed, 28 Oct 2026 21:03:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-01-1-aqs-state-queue/</guid><description>以 JDK 25 源码为准，拆开 AQS 的 state、head/tail 与 Node 四个字段，给出 javap 与反射实测输出，讲清旧版 waitStatus 四个常量到新版三个状态位的取舍，并解释为什么选择 CLH 变体队列以及它的适用边界。</description></item><item><title>《Java 并发编程·JUC 源码与容器》目录与学习路径</title><link>https://plumephp.com/java-conc-juc-toc/</link><pubDate>Wed, 28 Oct 2026 21:02:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-toc/</guid><description>《Java 并发编程·JUC 源码与容器》全书导航：说明本卷在三卷本中的位置、五部分十五章的依赖关系，给出顺序通读、症状驱动、按类查阅三条路径，并按部分列出 45 节完整索引、章间依赖图、全书实验清单与六个常见误区，便于按症状跳读或按章顺序通读，也便于当作类级查阅手册使用。</description></item><item><title>《Java 并发编程·JUC 源码与容器》前言：源码版本、工具与约定</title><link>https://plumephp.com/java-conc-juc-preface/</link><pubDate>Wed, 28 Oct 2026 21:01:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-preface/</guid><description>《Java 并发编程·JUC 源码与容器》前言：交代 JDK 25 源码的获取方式与包结构、用 unzip 与 javap 定位事实的方法、JMH 与 JCStress 的实验环境、源码摘录的标注约定，并列出本机核实过的 JDK 25 与旧版实现差异清单。</description></item><item><title>《Java 并发编程·JUC 源码与容器》序：为什么要读 JUC 源码</title><link>https://plumephp.com/java-conc-juc-foreword/</link><pubDate>Wed, 28 Oct 2026 21:00:00 +0800</pubDate><guid>https://plumephp.com/java-conc-juc-foreword/</guid><description>《Java 并发编程·JUC 源码与容器》开篇：从 JDK 25 里 AQS 被重写、经典教材的方法名全部消失这件事说起，说明读源码的三层收益、版本差异为何是本卷的头号风险，交代五部分十五章的结构、libraryd-conc 在本卷的改动范围，以及本书不承诺的内容。</description></item></channel></rss>