{"name":"并发工具类","id":"编程语言-JAVA-JAVA并发编程-并发工具类","content":"# JUC\n\n## 一、并发的第一性问题空间（Why 并发工具存在）\n\n所有 Java 并发工具，本质上都在解决**有限计算资源在多执行主体之间的分配与协调问题**。\n\n从第一性原理出发，并发系统只存在五类不可约的问题：\n\n### 1. 互斥（Mutual Exclusion）\n\n* 同一时刻，**共享资源只能被一个线程修改**\n* 本质冲突：写-写、读-写冲突\n\n### 2. 可见性（Visibility）\n\n* 一个线程对共享状态的修改，**何时、如何被其他线程观察到**\n\n### 3. 协调（Coordination）\n\n* 多个线程之间需要**在时间或阶段上达成一致**\n* 不是竞争，而是协作\n\n### 4. 资源限流（Throttling）\n\n* 资源有限（连接、线程、IO），需要控制**同时访问者数量**\n\n### 5. 上下文隔离与传播（Context Management）\n\n* 并发执行下，如何**安全地保存、传递线程上下文**\n\n> 所有 JUC 工具，都可以被映射回上述问题之一或组合。\n\n---\n\n## 二、Java 并发的总体架构分层（How Java 解决并发）\n\n```text\n并发问题空间\n   ↓\n并发抽象模型（锁 / 同步器 / 限流器 / 上下文）\n   ↓\n并发框架（AQS）\n   ↓\n具体工具类（ReentrantLock / Semaphore / CountDownLatch ...）\n```\n\n这一分层体现了 **稳定性递增原则**：\n\n* 越靠上，越接近不变原理\n* 越靠下，越接近实现细节\n\n---\n\n## 三、AQS：Java 并发的“内核抽象”\n\n### 3.1 AQS 的设计哲学\n\nAQS（AbstractQueuedSynchronizer）并不是“锁”，而是：\n\n> **竞争失败线程的统一管理框架**\n\n它抽象了并发控制中最稳定的三件事：\n\n1. **资源状态（state）**：资源是否可用\n2. **等待队列（FIFO）**：竞争失败者排队\n3. **阻塞 / 唤醒机制**：最小化 CPU 空转\n\n### 3.2 AQS 的核心模型\n\n```text\nstate（int）        → 资源状态机\n同步队列（CLH变体） → 管理竞争失败线程\n条件队列           → 管理协作型等待\n```\n\nAQS 通过模板方法模式，将**策略**交给子类：\n\n* tryAcquire / tryRelease\n* tryAcquireShared / tryReleaseShared\n\n而将**调度、排队、阻塞**统一托管。\n\n---\n\n## 四、互斥问题：ReentrantLock 与 synchronized\n\n### 4.1 抽象模型\n\n* **互斥锁 = 状态机 + 排队规则**\n* 可重入性本质：**线程身份绑定 + 计数状态**\n\n### 4.2 公平性：一种资源分配哲学\n\n| 策略   | 价值取向 | 代价   |\n| ---- | ---- | ---- |\n| 公平锁  | 顺序正义 | 吞吐下降 |\n| 非公平锁 | 系统效率 | 局部饥饿 |\n\n> 公平性不是技术问题，而是系统价值判断。\n\n### 4.3 synchronized vs ReentrantLock\n\n| 维度  | synchronized | ReentrantLock |\n| --- | ------------ | ------------- |\n| 实现层 | JVM          | JDK           |\n| 锁释放 | 自动           | 手动            |\n| 公平性 | 非公平          | 可配置           |\n| 中断  | 不支持          | 支持            |\n\n**工程哲学**：\n\n> 能用 synchronized，就不要用 Lock。\n\n---\n\n## 五、读写分离：ReentrantReadWriteLock 与 StampedLock\n\n### 5.1 读写锁的核心矛盾\n\n* **读多写少**是常态\n* 写操作必须独占\n* 读操作应最大化并发\n\n### 5.2 ReentrantReadWriteLock\n\n* 悲观并发模型\n* 明确区分读 / 写\n* 存在写饥饿与调度复杂性\n\n### 5.3 StampedLock：乐观并发的引入\n\n* 核心思想：**先假设没有写冲突**\n* 失败再回退为悲观锁\n\n> 这是从“锁竞争”向“冲突检测”的范式迁移。\n\n---\n\n## 六、协作而非竞争：同步器模型\n\n### 6.1 CountDownLatch —— 一次性门闩\n\n* 模型：**事件完成计数**\n* 特征：\n\n  * 不可重置\n  * 等待“结果”而非“资源”\n\n### 6.2 CyclicBarrier —— 阶段性对齐\n\n* 模型：**阶段同步点**\n* 可复用\n* 适用于迭代式并行计算\n\n### 6.3 两者的本质区别\n\n| 维度    | CountDownLatch | CyclicBarrier |\n| ----- | -------------- | ------------- |\n| 关注点   | 完成             | 对齐            |\n| 是否可复用 | 否              | 是             |\n| 思维模型  | 门闩             | 栅栏            |\n\n---\n\n## 七、资源限流：Semaphore\n\n### 7.1 抽象模型\n\n* **计数型共享资源控制器**\n* 本质不是锁，而是**配额**\n\n### 7.2 工程意义\n\n* 防止资源被打爆\n* 将系统不稳定性转化为排队等待\n\n---\n\n## 八、线程间数据交换与通信\n\n### 8.1 Exchanger\n\n* 双方同步点\n* 用于流水线、分治并行\n\n### 8.2 LockSupport\n\n* park / unpark 是 JVM 层的线程调度原语\n* AQS 的基础设施\n\n---\n\n## 九、上下文管理：ThreadLocal 及其演进\n\n### 9.1 ThreadLocal 的本质\n\n* **线程私有上下文容器**\n* 解决的是：\n\n  > 并发环境下的隐式参数传递问题\n\n### 9.2 核心风险\n\n* 线程池复用 → 脏数据\n* 生命周期不一致 → 内存泄漏\n\n### 9.3 InheritableThreadLocal 的局限\n\n* 只在**线程创建时复制**\n* 无法适配线程池\n\n### 9.4 TransmittableThreadLocal（TTL）\n\n* 本质：**上下文快照 + 回放机制**\n* 是对 ThreadLocal 在现代并发模型下的修正\n\n---\n\n## 十、工具选型的稳定方法论\n\n| 并发问题  | 首选工具           | 原因    |\n| ----- | -------------- | ----- |\n| 简单互斥  | synchronized   | 简单、安全 |\n| 高并发互斥 | ReentrantLock  | 可控策略  |\n| 读多写少  | StampedLock    | 乐观并发  |\n| 任务协作  | CountDownLatch | 一次性同步 |\n| 阶段并行  | CyclicBarrier  | 可复用   |\n| 资源保护  | Semaphore      | 配额控制  |\n| 上下文传递 | TTL            | 线程池友好 |\n\n## 关联内容（自动生成）\n\n- [/编程语言/JAVA/JAVA并发编程/基础概念.md](/编程语言/JAVA/JAVA并发编程/基础概念.md) 涵盖原子性、可见性和有序性等基本概念，这些是所有并发工具的基础理论\n- [/编程语言/JAVA/JAVA并发编程/线程.md](/编程语言/JAVA/JAVA并发编程/线程.md) 详细介绍了线程模型，这是所有并发工具协调的基础\n- [/编程语言/JAVA/JAVA并发编程/线程池.md](/编程语言/JAVA/JAVA并发编程/线程池.md) 讨论了线程池，其中大量使用了诸如CountDownLatch和Semaphore等并发工具\n- [/编程语言/JAVA/JAVA并发编程/并发集合.md](/编程语言/JAVA/JAVA并发编程/并发集合.md) 涵盖并发集合，这些集合通常与并发工具类协同工作\n- [/编程语言/JAVA/JAVA并发编程/JAVA并发编程.md](/编程语言/JAVA/JAVA并发编程/JAVA并发编程.md) 提供Java并发编程的整体框架，展示了并发工具在整个并发编程体系中的位置\n","metadata":"tags: ['编程语言', '并发编程', '数据库']","hasMoreCommit":true,"totalCommits":15,"commitList":[{"date":"2026-02-12T14:07:03+08:00","author":"MY","message":"doc: 整理标签","hash":"290b3e8ad18f48832ac282290238d020fc030a88"},{"date":"2026-01-14T16:12:53+08:00","author":"MY","message":"docs(JAVA): 更新JUC并发工具类文档并添加相关图片资源","hash":"f676fa1c8153922ad1e2aa621f65c73006af4863"},{"date":"2025-01-16T11:26:35+08:00","author":"MY","message":"📦AQS","hash":"00504fafc1113a39b1f62fbe29065cb755a3e699"},{"date":"2024-08-28T19:28:47+08:00","author":"MY","message":"✏并发工具类","hash":"6c22e5bbff176dc1fb35424a932b6b81d83018df"},{"date":"2024-06-05T14:47:56+08:00","author":"MY","message":"✏并发","hash":"7c6ef9e57ea5c46ce3933e394560d07213d85163"},{"date":"2022-10-19T21:32:18+08:00","author":"MY","message":"✏️Java并发编程","hash":"5ec012b5f65756ede6a0402ff1eb8eba6b398a9e"},{"date":"2022-04-18T16:44:54+08:00","author":"cjiping","message":"✏️更新 并发工具类","hash":"27706afe8d550424a937ed9973bc0ea796246272"},{"date":"2021-09-10T15:44:58+08:00","author":"cjiping","message":"📦整理 Java 并发工具类","hash":"f46e45c586d3c4fd71a48eeb86f687259ca00432"},{"date":"2021-09-09T16:04:56+08:00","author":"cjiping","message":"📦整理 Java 线程","hash":"38a99898a4b35a1db75c1e0e87df2defb5ce7525"},{"date":"2020-09-25T15:12:19+08:00","author":"0xcaffebabe","message":"✏更新 Java 并发编程 ThreadLocal","hash":"df8757284b174352df4ee22dcf927cc72e2a6527"}],"createTime":"2020-06-23T16:24:52+08:00"}