这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
《Java 并发编程·线程与内存模型》2.1 竞态的三种形态
用一个会超卖的借阅服务拆解竞态的三种形态:check-then-act、read-modify-write 与发布逸出。给出完整的 UnsafeLoanService 和 32 线程复现程序,并解释为什么这类测试不稳定、跑绿也不能证明线程安全,以及库存没变负时超卖仍然可能发生。
posts
这里是全站文章的归档入口,下面是按时间倒序排列的全部文章。若想按主题浏览,请从首页的专题分类进入。
用一个会超卖的借阅服务拆解竞态的三种形态:check-then-act、read-modify-write 与发布逸出。给出完整的 UnsafeLoanService 和 32 线程复现程序,并解释为什么这类测试不稳定、跑绿也不能证明线程安全,以及库存没变负时超卖仍然可能发生。
六个线程状态不是文档里的名词,而是 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 上必须显式配置注解处理器的实际坑。
从一笔支付回调被两个订单节点同时处理的场景出发,拆解 Raft 的三种角色、任期一票制、日志匹配与多数派提交规则;给出可 go test 的不变量骨架,逐条说明选举安全、日志匹配与 Figure 8 的判据,并区分共识、单主复制与幂等对账的适用边界。
从「回声」评论区「查看更多回复」翻页出现重复评论的事故写起,对比平铺、两层与多级评论树的代价,解释根评论按时间还是按热度分页、回复偏移量为什么会漂移,给出 Build、Page 的 Go 实现、坏输入与分页边界测试,以及一次真实运行输出和常见错误清单。
《Java 并发编程·线程与内存模型》开篇:从一次库存超卖事故出发,说明「会开线程、懂规则、能判断」三个能力层次,交代 libraryd-conc 的借阅主线、conc-core/conc-lab/conc-ops 三个模块、三卷分工,以及本书不承诺的内容和最小可运行闭环。
从「回声」一次点赞活动被代理池刷穿的事故写起:说明「同一用户对同一目标」「同一 IP 多账号」「同一设备批量注册」三种频控维度分别拦什么、漏什么,给出 Rule、Throttle、Allow 与 AllowE 的滑动窗口 Go 实现、表驱动测试和真实运行输出,并整理频控键设计的常见错误与边界。
整理 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 代码实现自动回滚看门狗和演练时间线记录。
从「回声」大 V 取消点赞后计数仍上涨的事故写起:对比精确计数、近似去重计数与对账重建三档方案,说明缓存计数何时可以滞后、何时必须回源,给出 Drift、Evaluate 与 NeedsRebuild 的 Go 实现、表驱动测试和真实运行输出,并整理对账的常见错误与边界。