<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>《Java 高级编程》 · 全书目录与章节索引（34 篇） on PlumePHP</title><link>https://plumephp.com/posts/books/java%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B/</link><description>Recent content in 《Java 高级编程》 · 全书目录与章节索引（34 篇） on PlumePHP</description><generator>Hugo</generator><language>zh-CN</language><lastBuildDate>Wed, 28 Oct 2026 09:45:00 +0800</lastBuildDate><atom:link href="https://plumephp.com/posts/books/java%E9%AB%98%E7%BA%A7%E7%BC%96%E7%A8%8B/index.xml" rel="self" type="application/rss+xml"/><item><title>《Java 高级编程》附录 D 诊断命令清单</title><link>https://plumephp.com/java-advanced-appendix-d-diagnostics/</link><pubDate>Wed, 28 Oct 2026 09:45:00 +0800</pubDate><guid>https://plumephp.com/java-advanced-appendix-d-diagnostics/</guid><description>按进程、线程、堆、JFR、字节码、依赖、运行时裁剪和启动参数八层，给出 libraryd 排障会用到的 jps、jcmd、jstack、jmap、jfr、javap、jdeps、jlink、-Xlog、--enable-preview、--enable-native-access 真实命令、观察点与场景，并逐条标注是否在本机执行。</description></item><item><title>《Java 高级编程》附录 C 版本特性矩阵</title><link>https://plumephp.com/java-advanced-appendix-c-version-matrix/</link><pubDate>Wed, 28 Oct 2026 09:30:00 +0800</pubDate><guid>https://plumephp.com/java-advanced-appendix-c-version-matrix/</guid><description>按 JDK 8/11/17/21/25 五个基线，把 records、sealed、模式匹配、虚拟线程、ScopedValue、FFM、StructuredTaskScope、JEP 491 与 JEP 472 的状态整理成矩阵，逐行标注正式、预览、移除及对 libraryd 的影响，并给出本机验证命令与常见版本误记。</description></item><item><title>《Java 高级编程》附录 B 反射与代理模板</title><link>https://plumephp.com/java-advanced-appendix-b-reflection-templates/</link><pubDate>Wed, 28 Oct 2026 09:15:00 +0800</pubDate><guid>https://plumephp.com/java-advanced-appendix-b-reflection-templates/</guid><description>把第 2 章的反射与动态代理整理成可套用模板：三个运行时注解、按实现类查找注解的审计与事务拦截器、Repository&lt;T, ID&gt; 代理工厂、record 组件读取、MethodHandles 替代，以及 InaccessibleObjectException 与模块 opens 处理。</description></item><item><title>《Java 高级编程》附录 A 并发 API 速查</title><link>https://plumephp.com/java-advanced-appendix-a-concurrency-api/</link><pubDate>Wed, 28 Oct 2026 09:00:00 +0800</pubDate><guid>https://plumephp.com/java-advanced-appendix-a-concurrency-api/</guid><description>按 libraryd 的借阅计数、事件流水线与仪表盘聚合三条线，整理 volatile、synchronized、ReentrantLock、Condition、原子类、ConcurrentHashMap、六种阻塞队列、同步器、Executors、虚拟线程与 StructuredTaskScope 的关键方法、选型与常见误用，并标注 JDK 25 的预览状态。</description></item><item><title>《Java 高级编程》9.3 优化决策：分配、锁与批处理的收益核算</title><link>https://plumephp.com/java-advanced-09-3-optimization-decisions/</link><pubDate>Wed, 28 Oct 2026 08:30:00 +0800</pubDate><guid>https://plumephp.com/java-advanced-09-3-optimization-decisions/</guid><description>JFR 找到热点之后，下一步不是立刻改代码，而是算收益。本节用同一台机器对比 Loan.state 与直接罚金计算的分配采样，用 JMH 量化 synchronized 与 LongAdder 的差距，并比较批量循环与 stream，最后给出 libraryd 的「先测量、再改、再回归」决策表。</description></item><item><title>《Java 高级编程》9.2 性能剖析：JFR、火焰图与热点定位</title><link>https://plumephp.com/java-advanced-09-2-profiling-jfr/</link><pubDate>Wed, 28 Oct 2026 08:00:00 +0800</pubDate><guid>https://plumephp.com/java-advanced-09-2-profiling-jfr/</guid><description>JMH 告诉你一次调用多快，JFR 告诉你时间花在哪。本节用 JDK 25 内置 Flight Recorder 记录 10 秒 libraryd 负载，执行 jfr summary、jfr view hot-methods 与 jfr print --events jdk.ExecutionSample，引用 156 个采样和 272 MB Overdue 分配，并说明火焰图边界。</description></item><item><title>《Java 高级编程》9.1 基准测试：JMH 的正确用法与常见陷阱</title><link>https://plumephp.com/java-advanced-09-1-jmh-benchmarks/</link><pubDate>Wed, 28 Oct 2026 07:30:00 +0800</pubDate><guid>https://plumephp.com/java-advanced-09-1-jmh-benchmarks/</guid><description>用 System.nanoTime 包一个循环，测出来的往往是 JIT 删除后的空操作。本节用 JMH 1.37 真跑 FinePolicyBenchmark，给出 Warmup、Measurement、Fork 配置和真实结果表，解释 JDK 25 下注解处理器默认关闭导致的 BenchmarkList 缺失，以及为什么 1.8 ns 的差异不能直接当成结论。</description></item><item><title>《Java 高级编程》8.3 原生互操作边界：稳定性、清理与替代方案</title><link>https://plumephp.com/java-advanced-08-3-native-boundaries/</link><pubDate>Wed, 28 Oct 2026 07:00:00 +0800</pubDate><guid>https://plumephp.com/java-advanced-08-3-native-boundaries/</guid><description>FFM 能调用 C，但 native 代码里的空指针会直接带走整个 JVM，try/catch 接不住。本节用真实的 SIGSEGV 崩溃输出说明隔离边界，讨论 Arena 清理、库卸载、跨平台分发与 JNI 迁移成本，并给出 libraryd 在 native 与纯 Java 校验器之间的选择与回退代码。</description></item><item><title>《Java 高级编程》8.2 FFM API：MemorySegment 与调用 C 库</title><link>https://plumephp.com/java-advanced-08-2-ffi-memory/</link><pubDate>Wed, 28 Oct 2026 06:30:00 +0800</pubDate><guid>https://plumephp.com/java-advanced-08-2-ffi-memory/</guid><description>JNI 需要写头文件、编译胶水代码、处理引用计数。本节用 JDK 25 正式的外函数与内存 API 编译 libisbn，通过 Linker、SymbolLookup 和 MemorySegment 真实调用 isbn13_check_digit，演示 Arena 生命周期与结构体布局，并记录不加 --enable-native-access 时的告警原文。</description></item><item><title>《Java 高级编程》8.1 JPMS 模块化：module-info、requires 与 jlink</title><link>https://plumephp.com/java-advanced-08-1-jpms-modules/</link><pubDate>Wed, 28 Oct 2026 06:00:00 +0800</pubDate><guid>https://plumephp.com/java-advanced-08-1-jpms-modules/</guid><description>classpath 上的 libraryd 能编译、能启动，却可能在运行时才暴露缺包和 split package。本节真写 module-info.java，用 jdeps 分析依赖、打成 modular jar，再用 jlink 裁出 32 MB、3 个模块的运行时，并记录缺模块、自动模块名和 classpath 绕过模块描述符的真实输出。</description></item><item><title>《Java 高级编程》7.3 模式匹配的边界：守卫、null 与可读性</title><link>https://plumephp.com/java-advanced-07-3-pattern-matching-limits/</link><pubDate>Tue, 27 Oct 2026 20:00:00 +0800</pubDate><guid>https://plumephp.com/java-advanced-07-3-pattern-matching-limits/</guid><description>穷尽 switch 只解决了「分支是否齐全」，没有解决 null、守卫顺序和模式嵌套过深。本节用 LoanState 演示 case null 的三种写法、when 守卫的求值规则、模式支配的编译错误，并说明 JDK 25 中 primitive patterns 仍是预览特性，不能带进生产代码。</description></item><item><title>《Java 高级编程》7.2 sealed 层次与穷尽 switch：把错误码变成类型</title><link>https://plumephp.com/java-advanced-07-2-sealed-switch/</link><pubDate>Tue, 27 Oct 2026 19:00:00 +0800</pubDate><guid>https://plumephp.com/java-advanced-07-2-sealed-switch/</guid><description>ErrorCode 枚举加 default 分支的问题不是写法丑，而是新增错误码时编译器不会提醒任何消费方。本节用 LoanState 和 LoanResult 的 sealed 层次演示穷尽 switch，真实编译一次「新增子类型」的失败，并给出 libraryd 中罚金、下一步动作与 HTTP 映射的落地代码。</description></item><item><title>《Java 高级编程》7.1 record 模式与解构：领域结果的扁平表达</title><link>https://plumephp.com/java-advanced-07-1-record-patterns/</link><pubDate>Tue, 27 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/java-advanced-07-1-record-patterns/</guid><description>借阅结果从 service 传到 HTTP 层时，instanceof 加强制转换把类型判断和取值拆成两段。本节用 record pattern 把 LoanResult、LoanState 和嵌套 record 一次解构，讨论未命名模式、守卫与泛型擦除带来的边界，并给出可编译的 libraryd 展示层代码。</description></item><item><title>《Java 高级编程》6.3 虚拟线程落地：连接池、ThreadLocal 与限流</title><link>https://plumephp.com/java-advanced-06-3-virtual-thread-pitfalls/</link><pubDate>Tue, 27 Oct 2026 17:00:00 +0800</pubDate><guid>https://plumephp.com/java-advanced-06-3-virtual-thread-pitfalls/</guid><description>虚拟线程让等待变便宜，但不会让连接变多。本节用 400 个任务打 10 个连接的实验说明并发度仍要显式限制，用池化线程上的 ThreadLocal 泄漏演示请求串号，再用 ScopedValue 与令牌桶给出 libraryd 的三件套落地写法。</description></item><item><title>《Java 高级编程》6.2 结构化并发：StructuredTaskScope 与作用域取消</title><link>https://plumephp.com/java-advanced-06-2-structured-concurrency/</link><pubDate>Tue, 27 Oct 2026 16:00:00 +0800</pubDate><guid>https://plumephp.com/java-advanced-06-2-structured-concurrency/</guid><description>三个查询扇出，一个 50ms 就失败，另一个却跑满 400ms——invokeAll 不会取消兄弟任务。本节用 JDK 25 预览版的 StructuredTaskScope 把 DashboardService 的三路聚合改成「全成功或全取消」，并实测失败 44ms 返回、超时 106ms 中止。</description></item><item><title>《Java 高级编程》6.1 虚拟线程原理：载体线程、挂起与 pinning</title><link>https://plumephp.com/java-advanced-06-1-virtual-threads/</link><pubDate>Tue, 27 Oct 2026 15:00:00 +0800</pubDate><guid>https://plumephp.com/java-advanced-06-1-virtual-threads/</guid><description>2000 个虚拟线程只用了 10 个载体线程，同一个虚拟线程睡一觉就换了载体。本节用三个可复现实验拆开挂起、迁移与 pinning，验证 JDK 24 JEP 491 之后 synchronized 不再 pin，而本地调用仍然占住载体，并给出 Javalin 7 的落地配置。</description></item><item><title>《Java 高级编程》5.3 同步器：CountDownLatch、Semaphore 与 CyclicBarrier</title><link>https://plumephp.com/java-advanced-05-3-synchronizers/</link><pubDate>Tue, 27 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/java-advanced-05-3-synchronizers/</guid><description>启动预热要等三件事都完成、数据库同时只能进十个任务、分批导出要四个线程每轮对齐。本节用三组真实运行对比 CountDownLatch、Semaphore 与 CyclicBarrier 的语义差异，给出 libraryd 的 StartupGate、DbConcurrencyGate 与 ExportBarrier 实现，以及各自的失效边界。</description></item><item><title>《Java 高级编程》5.2 阻塞队列：借阅事件流水线</title><link>https://plumephp.com/java-advanced-05-2-blocking-queues/</link><pubDate>Tue, 27 Oct 2026 13:00:00 +0800</pubDate><guid>https://plumephp.com/java-advanced-05-2-blocking-queues/</guid><description>借阅事件的审计写库不该拖慢请求线程。本节用 ArrayBlockingQueue 搭一条有界流水线，用 300 个事件、32 个槽位、2 个消费者的饱和实验展示背压与拒绝，再把优雅停止做成可观测的 pending、drained、abandoned 三个数。</description></item><item><title>《Java 高级编程》5.1 并发容器：ConcurrentHashMap 与 CopyOnWriteArrayList</title><link>https://plumephp.com/java-advanced-05-1-concurrent-collections/</link><pubDate>Tue, 27 Oct 2026 11:00:00 +0800</pubDate><guid>https://plumephp.com/java-advanced-05-1-concurrent-collections/</guid><description>用 synchronized 包一个 HashMap 也能线程安全，为什么 libraryd 还要换 ConcurrentHashMap？本节用 800 万次原子与非原子写入、三组键规模的对比实验，说明争用点在哪里，再用 CopyOnWriteArrayList 实现借阅监听器，给出两者的适用边界。</description></item><item><title>《Java 高级编程》4.3 锁与条件队列：synchronized、ReentrantLock 与 AQS</title><link>https://plumephp.com/java-advanced-04-3-locks-conditions/</link><pubDate>Tue, 27 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/java-advanced-04-3-locks-conditions/</guid><description>libraryd 需要一条借阅等待队列：没有可借副本时让请求有序等待，有人归还时唤醒其中一个。本节用超时、中断、条件队列三组实验对比 synchronized 与 ReentrantLock，手写一个基于 AQS 的 BooleanLatch，并给出 LoanWaitQueue 的完整实现与边界。</description></item><item><title>《Java 高级编程》4.2 原子类与 CAS：AtomicLong 与 LongAdder 的取舍</title><link>https://plumephp.com/java-advanced-04-2-atomics-cas/</link><pubDate>Tue, 27 Oct 2026 09:00:00 +0800</pubDate><guid>https://plumephp.com/java-advanced-04-2-atomics-cas/</guid><description>8 个线程各增 100 万次，普通 long 只数到 333 万。本节用真实计数实验比较 AtomicLong 与 LongAdder 的吞吐与适用面，手写一遍 CAS 循环，再用 Treiber 栈复现 ABA 并给出 AtomicStampedReference 的修法，最后落到 libraryd 的 LoanCounters 与 LoanMetrics。</description></item><item><title>《Java 高级编程》4.1 可见性与重排序：volatile 与 happens-before</title><link>https://plumephp.com/java-advanced-04-1-jmm-visibility/</link><pubDate>Tue, 27 Oct 2026 08:00:00 +0800</pubDate><guid>https://plumephp.com/java-advanced-04-1-jmm-visibility/</guid><description>libraryd 的缓存刷新线程写了新值，请求线程却一直读旧的。本节用停止标志与 Dekker litmus 两组可复现实验，量化可见性与重排序，讲清 happens-before 的六条规则，再落到 LifecycleFlag 与 AvailabilityCache 的 volatile 发布写法。</description></item><item><title>《Java 高级编程》3.3 Instrumentation 与 Java Agent：无侵入计时</title><link>https://plumephp.com/java-advanced-03-3-instrumentation-agent/</link><pubDate>Mon, 26 Oct 2026 20:00:00 +0800</pubDate><guid>https://plumephp.com/java-advanced-03-3-instrumentation-agent/</guid><description>libraryd 想在不改 LibraryService 源码的前提下测量 borrow 耗时，Java Agent 是最小侵入的入口。本节实现 Premain-Class 与 Can-Retransform-Classes 清单，用 Byte Buddy 1.18.16 的 Advice 在方法进出打点，真实运行 -javaagent 并读取 agent: borrow took N µs。</description></item><item><title>《Java 高级编程》3.2 字节码入门：javap、常量池与 ASM/Byte Buddy</title><link>https://plumephp.com/java-advanced-03-2-bytecode-basics/</link><pubDate>Mon, 26 Oct 2026 19:00:00 +0800</pubDate><guid>https://plumephp.com/java-advanced-03-2-bytecode-basics/</guid><description>第 3 章要改写 libraryd 的字节码，第一步不是选库，而是读懂编译器到底生成了什么。本节用 javap -c -p -v 拆开 FineCalculator 的常量池、栈机器指令和 invokedynamic，再用 ASM 9.11.1 统计方法指令、用 Byte Buddy 1.18.16 生成子类，并给出两者的选择边界。</description></item><item><title>《Java 高级编程》3.1 类加载器与双亲委派：从平台加载器到插件加载器</title><link>https://plumephp.com/java-advanced-03-1-classloaders/</link><pubDate>Mon, 26 Oct 2026 18:00:00 +0800</pubDate><guid>https://plumephp.com/java-advanced-03-1-classloaders/</guid><description>libraryd 的 ISBN 校验规则要允许客户以 jar 形式追加，不能每次改规则都重新打包整个服务。本节从三层类加载器与双亲委派讲起，实现 PluginClassLoader 的 findClass 与 findResources，用 META-INF/services 和 ServiceLoader 真正加载一次插件 jar，并记录类加载器身份。</description></item><item><title>《Java 高级编程》2.3 动态代理：给仓储加事务与重试</title><link>https://plumephp.com/java-advanced-02-3-dynamic-proxy/</link><pubDate>Mon, 26 Oct 2026 17:00:00 +0800</pubDate><guid>https://plumephp.com/java-advanced-02-3-dynamic-proxy/</guid><description>libraryd 的每个仓储写方法都包着 begin/commit/rollback，复制到第三个实现时已经很难保持一致。本节用 JDK 动态代理把 TransactionManager.inTransaction 接到仓储接口上，处理默认方法、Object 方法和受检异常，并说明为什么代理只能代理接口、自调用为什么会绕过它。</description></item><item><title>《Java 高级编程》2.2 注解与运行时元数据：@Audit 与 @Retry</title><link>https://plumephp.com/java-advanced-02-2-annotations-metadata/</link><pubDate>Mon, 26 Oct 2026 16:00:00 +0800</pubDate><guid>https://plumephp.com/java-advanced-02-2-annotations-metadata/</guid><description>libraryd 的借阅方法既要记审计，又要在目录服务短暂超时时重试，手写 try/catch 会把业务代码淹掉。本节定义 @Audit 与 @Retry 两个运行时注解，用反射读取 action 与重试参数，实现一个带退避的调用器，并说明保留级别、默认值和幂等性边界。</description></item><item><title>《Java 高级编程》2.1 反射核心：Class、Method 与访问控制</title><link>https://plumephp.com/java-advanced-02-1-reflection-core/</link><pubDate>Mon, 26 Oct 2026 15:00:00 +0800</pubDate><guid>https://plumephp.com/java-advanced-02-1-reflection-core/</guid><description>libraryd 的审计日志不想为 Book、Member、Loan 各写一套字段提取代码，反射是把它做成一个通用组件的最小代价。本节从 Class 的三种来源讲到 Method 查找、invoke 调用、构造器创建，再落到 trySetAccessible 与模块边界，最后给出可用于 record 的字段映射实现。</description></item><item><title>《Java 高级编程》1.3 类型擦除与类型令牌：TypeReference 与反射补偿</title><link>https://plumephp.com/java-advanced-01-3-type-erasure-tokens/</link><pubDate>Mon, 26 Oct 2026 14:00:00 +0800</pubDate><guid>https://plumephp.com/java-advanced-01-3-type-erasure-tokens/</guid><description>libraryd 的 JSON 层要反序列化 Page&lt;Book&gt;，但 Page.class 只保留原始类型，Book 这个实参在运行时已经消失。本节用真实编译错误说明擦除的边界，实现一个基于匿名子类的 TypeRef，并把 Page&lt;Book&gt;、Map&lt;String, List&lt;Book&gt;&gt; 的类型令牌接到接口响应解码上。</description></item><item><title>《Java 高级编程》1.2 型变与通配符：PECS 在查询 API 里的落地</title><link>https://plumephp.com/java-advanced-01-2-variance-wildcards/</link><pubDate>Mon, 26 Oct 2026 13:00:00 +0800</pubDate><guid>https://plumephp.com/java-advanced-01-2-variance-wildcards/</guid><description>libraryd 的查询 API 一旦同时接受 Book 和子类型、又要往集合里写回结果，就会撞上泛型不变性。本节用数组协变与 ArrayStoreException 做对照，按 PECS 拆解 extends 与 super 的读写方向，并把 Page 映射、批量保存和过滤谓词的签名落到仓储端口上。</description></item><item><title>《Java 高级编程》1.1 泛型边界：从 Book 到 Repository&lt;T, ID&gt;</title><link>https://plumephp.com/java-advanced-01-1-generic-boundaries/</link><pubDate>Mon, 26 Oct 2026 11:00:00 +0800</pubDate><guid>https://plumephp.com/java-advanced-01-1-generic-boundaries/</guid><description>libraryd 的仓储接口从每个实体一份复制粘贴，收敛到 Repository&lt;T, ID&gt;。本节解释两个类型参数各自约束什么、有界类型参数如何把可比较性写进签名、编译器生成的桥方法从哪来，并用 javap 看清擦除后的真实字节码，最后给出泛型仓储的边界清单。</description></item><item><title>《Java 高级编程》目录</title><link>https://plumephp.com/java-advanced-toc/</link><pubDate>Mon, 26 Oct 2026 10:00:00 +0800</pubDate><guid>https://plumephp.com/java-advanced-toc/</guid><description>《Java 高级编程》全书导航页：说明卷三在四卷本中的位置、读者画像与前置知识，给出机制补课、改造 libraryd 与排障速查三条学习路径，并按四个部分列出 9 章 27 节的完整索引、项目改造状态、版本依赖与验证方式，另附序、前言和附录 A–D。</description></item><item><title>《Java 高级编程》前言</title><link>https://plumephp.com/java-advanced-preface/</link><pubDate>Mon, 26 Oct 2026 09:00:00 +0800</pubDate><guid>https://plumephp.com/java-advanced-preface/</guid><description>交代本书的读者对象、前置知识与九章结构，列出 JDK 25、Maven、Docker 与 clang 的环境清单和真实版本输出，说明代码、实验与命令的书写约定、三种验证层次，以及版本不一致时从 JDK、预览开关、模块路径到本地库的六步排查顺序。</description></item><item><title>《Java 高级编程》序</title><link>https://plumephp.com/java-advanced-foreword/</link><pubDate>Mon, 26 Oct 2026 08:00:00 +0800</pubDate><guid>https://plumephp.com/java-advanced-foreword/</guid><description>说明卷三为什么在能跑的服务之后还要单独讲语言机制，交代类型系统、运行时、并发与平台性能四个层次，与卷四 JVM 调优和 Spring Boot 卷的分工，并列出 JDK 25 中 synchronized 不再 pin 虚拟线程、ScopedValue 正式、StructuredTaskScope 仍是预览等版本边界，以及三条阅读路径与代码验证方式。</description></item></channel></rss>