月度归档:2026年10月 (59)
协作三件套: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 的七大参数逐个点名,任务旅程的判定顺序——队列先于非核心线程,很多人记反。
ThreadLocal:每个线程的抽屉,与那桩著名的内存泄漏
SimpleDateFormat 并发错乱引出线程私有数据:数据存在 Thread 身上的 map,ThreadLocal 只是钥匙。弱引用 key 与强引用 value 的组合拳,以及线程池下的串台事故。
读写锁:读多写少的专属答案,与 StampedLock 乐观读
写写互斥、读写互斥、读读共享;锁降级为什么允许、读升级写为什么被禁止。读多写极少场景的终极方案 StampedLock:乐观读先读后校验,近乎无锁。
ReentrantLock:比 synchronized 多出来的四样东西
可中断、可超时、可公平、多条件队列——四个能力一次讲透,用 Condition 改造生产者消费者告别 notify 误伤。选型观:默认 synchronized,四样都不缺才换锁。
AQS(下):共享模式与一次完整源码走读
tryAcquireShared 负数排队、非负通行的传播唤醒;以 ReentrantLock 非公平锁的 lock() 为例完整走读——公平与非公平的全部差异,就是要不要先看队列。