一杯咖啡的时间,聊聊技术与成长
定位工具箱:performance_schema 与 sys schema 实战
凌晨 CPU 飙高是谁干的?MySQL 自带的体检仪实战:按 digest 找 TOP 慢 SQL、sys.session 抓现行、innodb_trx 揪长事务、锁等待与 MDL 一次排清。
收官复盘:一张并发作战地图
二十一篇归结为一条主线:三宗罪。原子性找锁与 CAS,可见性有序性找 volatile,等待协调找三件套与队列,线程管理找池与虚拟线程——按问题找工具,一页纸装下全系列。
虚拟线程:JDK 21 的并发新范式
阻塞从「占住一条 OS 线程」变成「堆上多存一段栈」,便宜了三个数量级。mount/unmount 原理、不池化的新哲学、synchronized 钉住载体线程的坑与 JDK 24 的修复。
CompletableFuture:异步编排的正确姿势
Future 只会干等,编排要靠回调流水线。三个下游接口从串行 700ms 到并行 300ms 的聚合模板;commonPool 的共享陷阱与自定义线程池;thenCompose 链式与超时兜底。
协作三件套:CountDownLatch、CyclicBarrier、Semaphore
锁解决「不能同时干」,三件套解决「什么时候一起干」。CDL 等事件(一次性)、Barrier 等同伴(可循环)、Semaphore 管配额(可增减),全是 AQS 共享模式的三个分身。
并发容器补全:CopyOnWriteArrayList 与 BlockingQueue 家族
写时复制的读多写少神器,代价是内存翻倍与弱一致;BlockingQueue 家族的锁粒度差异与三组 API——put/take 阻塞、offer/poll 让路、add/remove 炸雷,生产者消费者的现代标准答案。
ConcurrentHashMap:从分段锁到 CAS + synchronized
HashMap 并发用的两个血案现场;JDK 7 分段锁 16 段的笨拙与聪明;JDK 8 把锁做到单个桶——CAS 空桶加 synchronized 锁头节点,size 统计用的是 LongAdder 思想。
线程池(下):参数怎么定、拒绝策略选哪个、怎么动态调
四种拒绝策略各有哲学:宁可吵着失败,不要安静地丢。公式给起点、压测给终点;参数外置加运行时 setter 实现动态线程池;shutdown 与 shutdownNow 的温和与粗暴。
线程池(上):七大参数与一个任务的完整旅程
为什么大厂规范禁止 Executors?无界队列与无界线程数两个 OOM 现场复盘。手动 new 的七大参数逐个点名,任务旅程的判定顺序——队列先于非核心线程,很多人记反。