{"name":"基础概念","id":"编程语言-JAVA-JAVA并发编程-基础概念","content":"# Java 并发编程基础概念\n\n## 一、并发的第一性原理（Why）\n\n### 1. 并发问题的本质\n\n**并发问题 ≠ 多线程问题**\n\n并发问题产生的充分必要条件是：\n\n> **多个执行主体 + 共享的可变状态 + 时间上的交错执行**\n\n只要满足以上三个条件之一被消除，并发问题就不会出现：\n\n* 不共享 → 无并发问题\n* 不可变 → 无并发问题\n* 无时间交错（串行） → 无并发问题\n\n---\n\n### 2. 并发失效的根源：观察不一致\n\n并发错误的本质不是“写错代码”，而是：\n\n> **一个线程基于已经失效的观察结果做出了决策**\n\n这会导致典型问题：\n\n* 竞态条件（Race Condition）\n* 脏读、不可重复读\n* 单例失效、状态错乱\n\n---\n\n### 3. 并发必须满足的三大约束目标\n\n所有并发控制手段，本质上都在解决以下三个问题之一或多个：\n\n| 约束目标    | 根本问题  | 核心含义      |\n| ------- | ----- | --------- |\n| **原子性** | 操作被打断 | 要么全做，要么不做 |\n| **可见性** | 观察失效  | 状态修改对他人可见 |\n| **有序性** | 指令重排  | 因果顺序不被破坏  |\n\n👉 **并发工具的差异，本质是它们解决这三类约束的能力不同。**\n\n---\n\n## 二、线程安全的抽象模型（What）\n\n### 1. 线程安全的本质定义\n\n> 当多个线程并发访问某个对象时，无论执行顺序如何、是否发生交错，只要对象始终能维持其不变式（Invariant），则称该对象是线程安全的。\n\n⚠️ 线程安全与“全局变量 / 静态变量”**没有必然因果关系**，\n真正的风险来源是：\n\n> **共享 + 可变 + 未受控访问**\n\n---\n\n### 2. 线程安全的经典分类（稳定认知模型）\n\n| 分类         | 抽象定义      | 设计含义        |\n| ---------- | --------- | ----------- |\n| **绝对线程安全** | 调用方无需任何同步 | 内部完全自洽，代价最高 |\n| **相对线程安全** | 单次操作安全    | 组合操作需外部协作   |\n| **线程兼容**   | 自身不安全     | 可通过调用方同步保证  |\n| **线程对立**   | 无法安全并发使用  | 设计上排斥并发     |\n\n👉 这是**并发设计的边界说明书**，而不是实现技巧。\n\n---\n\n### 3. 不可变性：最强的并发策略\n\n> **不可变对象天然线程安全**\n\n设计哲学：\n\n* 状态只在构造期确定\n* 之后永不变化\n* 并发复杂度直接归零\n\n这是所有并发控制中：\n\n> **成本最低、收益最高、最稳定的方案**\n\n---\n\n## 三、并发控制的设计哲学（How · Strategy）\n\n### 1. 并发控制的三种核心策略\n\n| 策略     | 核心思想         | 典型方式        |\n| ------ | ------------ | ----------- |\n| **互斥** | 同一时间只允许一个执行者 | 锁 / Monitor |\n| **乐观** | 冲突是小概率事件     | CAS / 版本校验  |\n| **隔离** | 根本不共享状态      | 不可变 / 线程封闭  |\n\n👉 并发设计的第一选择顺序应是：\n\n> **隔离 → 乐观 → 互斥**\n\n---\n\n### 2. 悲观并发 vs 乐观并发（哲学差异）\n\n* **悲观并发**：\n\n  * 假设冲突必然发生\n  * 先加锁，再执行\n  * 代价是阻塞和上下文切换\n\n* **乐观并发**：\n\n  * 假设冲突是例外\n  * 先执行，失败再补偿\n  * 代价是自旋和重试\n\n👉 这是**性能与确定性之间的取舍问题**。\n\n---\n\n### 3. 阻塞 vs 非阻塞算法\n\n> 在非阻塞算法中，一个线程的失败或挂起不会导致其他线程的失败或挂起。\n\n这是并发系统**可伸缩性（Scalability）**的关键。\n\n---\n\n## 四、并发机制模型（How · Mechanism）\n\n### 1. Java 内存模型（JMM）\n\nJMM 不是内存结构，而是：\n\n> **关于“何时可见、何时有序、何时允许重排”的规则集合**\n\n核心目标：\n\n* 屏蔽硬件与编译器差异\n* 定义 Happens-Before 关系\n\n---\n\n### 2. Happens-Before：并发世界的因果律\n\nHappens-Before 不是时间先后，而是：\n\n> **结果可见性与因果保证**\n\n关键规则：\n\n* 程序次序规则\n* volatile 规则\n* 监视器锁规则\n* 传递性\n\n---\n\n### 3. Monitor 模型（互斥的抽象基础）\n\nMonitor 提供了：\n\n* 互斥访问\n* 条件等待（Wait / Notify）\n* 内存可见性保证\n\n这是 synchronized 的**理论原型**。\n\n---\n\n### 4. CAS 与 CPU 原语\n\nCAS（Compare-And-Swap）是：\n\n> **由硬件直接支持的原子比较与更新指令**\n\n特点：\n\n* 非阻塞\n* 高并发友好\n* 存在 ABA 与自旋成本\n\n---\n\n## 五、Java 并发工具的能力映射（How · Tool）\n\n### 1. 并发能力 × Java 工具矩阵\n\n| 并发能力 | 抽象机制           | Java 实现             |\n| ---- | -------------- | ------------------- |\n| 互斥   | Monitor        | synchronized / Lock |\n| 可见性  | Happens-Before | volatile            |\n| 原子更新 | CAS            | AtomicX             |\n| 非阻塞  | 无锁算法           | CAS + 自旋            |\n\n---\n\n### 2. synchronized 的设计定位\n\nsynchronized 不是“慢”，而是：\n\n> **最安全、最完整、语义最强的并发原语**\n\n它同时提供：\n\n* 互斥\n* 可见性\n* 有序性\n\n锁升级（偏向 → 轻量 → 重量）体现的是：\n\n> **JVM 对不同竞争强度的自适应优化**\n\n---\n\n### 3. volatile 的设计定位\n\nvolatile 只解决：\n\n* 可见性\n* 有序性\n\n但**不提供互斥**。\n\n适用场景：\n\n* 状态标志\n* 生命周期控制\n* 单次写、多次读\n\n---\n\n### 4. CAS 的设计定位\n\nCAS 是：\n\n> **以 CPU 指令换取锁阻塞的性能方案**\n\n适合：\n\n* 冲突概率低\n* 操作时间短\n* 可接受重试成本\n\n---\n\n## 六、并发设计的稳定选型原则（Guideline）\n\n1. **能不共享，就不共享**（隔离优先）\n2. **能不可变，就不可变**（设计优先）\n3. **能无锁，就无锁**（乐观优先）\n4. **必须互斥，才加锁**（兜底方案）\n5. **先保证正确性，再谈性能**\n\n---\n\n## 七、并发模型的演进：从线程到纤程\n\n### 1. 传统线程模型的瓶颈\n\n* 1:1 映射内核线程\n* 切换成本高\n* 并发规模受限\n\n---\n\n### 2. 协程 / 纤程的核心思想\n\n新并发模型拆分为：\n\n* **Continuation（执行过程）**：保存与恢复上下文\n* **Scheduler（调度器）**：决定何时运行\n\n目标不是“更快”，而是：\n\n> **用更低成本管理更大规模的并发**\n\n## 关联内容（自动生成）\n\n- [/编程语言/JAVA/JVM/JVM.md](/编程语言/JAVA/JVM/JVM.md) JVM的内存模型和执行机制是理解Java并发编程的基础，特别是JMM与JVM内存结构的关系\n- [/编程语言/JAVA/JVM/自动内存管理/垃圾回收.md](/编程语言/JAVA/JVM/自动内存管理/垃圾回收.md) 垃圾回收过程中的并发与并行处理与Java并发编程中的线程协调机制密切相关\n- [/编程语言/JAVA/JVM/JAVA内存模型.md](/编程语言/JAVA/JVM/JAVA内存模型.md) Java内存模型(JMM)是Java并发编程的核心理论基础，详细阐述了内存可见性、原子性和有序性问题\n- [/中间件/数据库/数据库系统/事务管理/事务.md](/中间件/数据库/数据库系统/事务管理/事务.md) 数据库事务的ACID特性与并发控制和Java并发编程中的原子性、一致性概念相通\n- [/操作系统/进程与线程.md](/操作系统/进程与线程.md) 操作系统层面的进程与线程管理机制为Java并发编程提供了底层基础\n- [/编程语言/JAVA/语言基础.md](/编程语言/JAVA/语言基础.md) Java语言基础特性是理解并发编程的前提，包括对象模型、内存分配等\n- [/软件工程/架构/系统设计/高并发.md](/软件工程/架构/系统设计/高并发.md) 高并发系统设计实践应用了Java并发编程的基本原理和工具\n- [/编程语言/JAVA/JAVA并发编程/线程池.md](/编程语言/JAVA/JAVA并发编程/线程池.md) 线程池是Java并发编程的重要组成部分，是对基础线程概念的应用和扩展\n- [/编程语言/JAVA/JAVA并发编程/并发工具类.md](/编程语言/JAVA/JAVA并发编程/并发工具类.md) 并发工具类是Java并发编程基础概念的具体实现\n- [/编程语言/JAVA/JAVA并发编程/线程.md](/编程语言/JAVA/JAVA并发编程/线程.md) 线程是Java并发编程的基本执行单元，与本文档中的线程安全概念密切相关\n- [/编程语言/JAVA/高级/NIO.md](/编程语言/JAVA/高级/NIO.md) Java NIO中的并发处理与本文档中的并发概念密切相关\n","metadata":"tags: ['编程语言', '并发编程']","hasMoreCommit":false,"totalCommits":1,"commitList":[{"date":"2026-06-11T22:56:06+08:00","author":"MY","message":"feat(cache): 添加缓存装饰器自定义键支持并优化缓存策略","hash":"ceec5426ef50ec3fe0b850b4975a7e3c8a930927"}],"createTime":"2026-06-11T22:56:06+08:00"}