《Java 并发编程·线程与内存模型》1.3 生命周期、优先级与守护线程
六个线程状态不是文档里的名词,而是 jstack 里能对上的现场:用 latch 与监视器构造 NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED 并贴实测输出,解释 BLOCKED 与 WAITING 的排障差异,再说明优先级不可靠与守护线程退出时 finally 不执行的边界。
tag
六个线程状态不是文档里的名词,而是 jstack 里能对上的现场:用 latch 与监视器构造 NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED 并贴实测输出,解释 BLOCKED 与 WAITING 的排障差异,再说明优先级不可靠与守护线程退出时 finally 不执行的边界。
把任务从执行器中拆出来:对比 Runnable 与 Callable 的签名差异,用完整 TaskProbe 演示 submit 取回 Optional 结果、Future.get 阻塞、ExecutionException 包装,追踪裸线程、execute 与 submit 三条异常路径,并给出可命名的 ThreadFactory。
从进程地址空间与栈讲起,说明 JVM 平台线程与内核线程 1:1 映射的代价,给出完整 ThreadProbe 类、2000 个线程的创建耗时、threadId 等元信息,以及 jcmd Thread.print 的逐行读法,最后列出创建线程时最常见的四个坑。
《Java 并发编程·线程与内存模型》全书导航:说明卷一在三卷本中的位置、四个部分与十五章的依赖关系,给出顺序通读、症状驱动、源码对照三条学习路径,并按部分列出 45 节完整索引、章间依赖、全书实验清单与六个常见误区,便于按症状跳读或按章顺序通读。
交代本书的运行环境与版本基线:JDK 25、Maven 3.9.12、JCStress 0.16、JMH 1.37,给出 libraryd-conc 三模块的目录与 pom 配置、领域模型完整定义、preview 开关,以及 JCStress 在 JDK 25 上必须显式配置注解处理器的实际坑。
《Java 并发编程·线程与内存模型》开篇:从一次库存超卖事故出发,说明「会开线程、懂规则、能判断」三个能力层次,交代 libraryd-conc 的借阅主线、conc-core/conc-lab/conc-ops 三个模块、三卷分工,以及本书不承诺的内容和最小可运行闭环。
《Java 并发编程·线程与内存模型》全 50 篇,从进程与线程模型讲到 JMM、volatile 与 synchronized、等待通知、中断、ThreadLocal 与 ScopedValue、CAS 与原子类、锁选型、线程池、定时任务、ForkJoin、CompletableFuture、虚拟线程与结构化并发,配 JCStress 与本机实测输出:15 章 45 节加前置与附录的完整索引。
整理 macOS 上排查 linkd-v3 的可复制命令:JDK 与 Maven、keytool 与 openssl、lsof 与 netstat、tcpdump lo0、ab、jcmd 与 JFR,每条说明用途、平台限制与风险,并给出从端口到线程栈再到 JFR 的组合排查路径。
按 gRPC 核心、Metadata 与 Status、Protobuf、JDK HttpClient、HTTP server、并发与时间六组,列出卷三用到的类、方法签名、用途与对应章节,只收白名单 API,并标出容易记错的重载与调用顺序,供写 linkd-v3 时直接查表。
运行手册要在凌晨三点也能照着做。本节给出 linkd-v3 的启动停止、健康检查、五类常见故障的处置顺序、升级回滚步骤和值班交接模板,用两段可编译的 Java 代码实现优雅关闭与健康探针,并给出带「验收缺口」的复盘格式、回归证据要求和常见误操作清单。
验收不是再跑一次健康检查。本节把 linkd-v3 接入 libraryd 的验收拆成编译单测、契约测试、连通性与超时、限流熔断、TLS、指标日志追踪、灰度回滚七组,每条给出命令或断言,并附五条故障注入与两段可编译的 JUnit 测试代码。
把前十四章的能力装进一条真实链路:HTTP 客户端 → 9094 网关 → 9093 gRPC Library → 8080 libraryd。本节给出超时预算 800/300 ms 的逐段分配、失败传播图,以及重试、熔断、限流分别由谁负责的边界,并附两段可编译代码。
成本不是月底看账单。本节按核数、内存、出口流量拆开 linkd-v3 的月度成本,给出可复算的估算模型与两个算例,讨论 CPU 之外的扩缩容信号、冷启动的代价、最小副本与预算上限,以及预算与 SLO 之间的取舍,并附两段可编译的 Java 代码。
压测不是把 ab 的 -n 调大。本节区分恒定、阶梯、尖峰、浸泡四种剖面,给出吞吐、错误率与 p50/p95/p99 的口径,讲清协调缺失如何美化延迟,并用 ManagedChannel 写一个固定并发、按预期开始时间计时的 gRPC 压测客户端。
容量不是「多开几个线程」。本节用 Little's law 的 L=λW 把 200 rps × 800 ms = 160 在途算清楚,给出线程、连接、队列与并发的对应关系、Amdahl 定律下的瓶颈判断,以及一段可运行的 Java 容量模型代码和完整算例。
一次演练要有开始时间、结束时间、回滚路径和观察者,否则就会变成事故。本节给出假设→注入→观察→回滚→复盘五步闭环、单次演练记录表、超时与熔断护栏、独立的 kill switch 通道,以及两段 Java 代码实现自动回滚看门狗和演练时间线记录。
不引入混沌平台,只用 ServerInterceptor 和 ClientInterceptor 实现延迟、异常、丢弃与半开连接四类注入。开关默认关闭、只对测试租户生效、按请求 ID 哈希固定比例,给出完整可编译代码、装配方式与误伤生产流量的六条边界。
故障不是一句「服务挂了」。本节按依赖、资源、流量、代码、配置五类拆开 linkd-v3 链路的失效来源,给出爆炸半径分级表、稳态假设的写法、MTTD/MTTR 的拆解口径,并用一段 Java 代码计算一次故障影响的请求量,最后划清故障注入与生产环境的边界。
把版本兼容从口头约定变成 CI 门禁:用 Descriptors.FileDescriptor 对比上一版与当前 proto,检查字段号、类型、标签、枚举值和服务方法,并给出 golden 快照、JUnit 测试与破坏性变更回滚流程的具体实现。
把 12.1 的 v1/v2 并存接到真实流量:用租户白名单、请求 ID 哈希和 x-canary 声明做确定性切流,给出 CanaryRouter、服务端指标标记、回滚开关与放量门槛的完整代码、口径,并说明常见误判、边界条件与自动回滚的冷却要求。