{"name":"JAVA并发编程","id":"编程语言-JAVA-JAVA并发编程-JAVA并发编程","content":"# Java 并发编程\n\n> 并发的本质、内存模型、控制哲学、性能与伸缩性、测试与反模式等**原理**，见母篇\n> [/编程语言/并发编程.md](/编程语言/并发编程.md)。本文聚焦 Java/JVM 的**具体落地与独有机制**。\n\n## Java 并发实现栈\n\nJava 把母篇所说的\"协调机制\"落地为一个分层栈，上层依赖下层：\n\n```text\n并发设计模式（实例封闭、委托、状态依赖…）\n        ↓\nJUC 抽象（Lock、Semaphore、CyclicBarrier、CountDownLatch）\n        ↓\n同步器底座（AQS）+ 等待通知（wait/notify、Condition）\n        ↓\n硬件（内存屏障、CAS / CompareAndSwap）\n```\n\n**AQS（AbstractQueuedSynchronizer）** 是 JUC 的统一底座：用一个 `volatile int state` + CLH 等待队列，把\"获取 / 释放\"抽象为模板方法。ReentrantLock、Semaphore、CountDownLatch 都只是对 state 语义的不同解释。理解 AQS，等于理解半个 JUC。\n\n## 可见性与有序性的 Java 工具\n\n母篇讲清了 happens-before 的原理；Java 把它落为三个关键字，各自建立不同的 hb 边：\n\n| 关键字 | 建立的保证 | happens-before 规则 |\n| --- | --- | --- |\n| `synchronized` | 互斥 + 可见性 + 有序性 | 解锁 hb 后续加锁 |\n| `volatile` | 可见性 + 有序性（**非原子**） | 写 hb 后续读 |\n| `final` | 安全发布的初始化可见性 | 构造结束 freeze，正确发布后可见 |\n\n> 完整的 JMM happens-before 规则（程序顺序、线程启动 / 终止、中断等）见 [/编程语言/JAVA/JVM/JAVA内存模型.md](/编程语言/JAVA/JVM/JAVA内存模型.md)。\n\n## 对象共享的 Java 设计模式\n\n母篇的设计模式是通用的（Immutable、Thread Confinement…）；Java 实践层有三个更具体的惯用法：\n\n| 模式 | 做法 | 关键约束 |\n| --- | --- | --- |\n| 实例封闭 | 把非线程安全对象包进受控边界，对外只暴露安全接口 | 并发策略集中在一处，最稳健 |\n| 线程安全委托 | 把安全责任交给底层线程安全组件（如 ConcurrentHashMap） | 不得引入跨组件的复合状态——\"多个原子操作组合后不再原子\" |\n| 状态依赖操作 | 操作依赖某状态条件成立 | 条件检查 → 等待 → 唤醒后重校验 |\n\n对象安全发布的手段（静态初始化 / final / volatile / 锁）及其 hb 机制见母篇「安全发布」。\n\n## 等待-通知与协作机制\n\n等待不是睡眠，而是**条件未满足时让出执行权、等待通知**。\n\nwait/notify 三原则（违反即 Bug）：\n\n- 等待必须在持有锁时进行，`wait()` 会**释放锁**\n- 被唤醒 ≠ 条件满足 → 条件检查必须放在 **while 循环**里\n- 优先 `notifyAll`，`notify` 易丢唤醒\n\n**Condition（显式条件队列）** 相比 wait/notify 的增量：多条件分离、精准唤醒、可中断 / 可超时等待。它是状态机式并发设计的基础设施。\n\n## 取消、中断与生命周期管理\n\nJava 没有\"强杀线程\"——生命周期管理是一套**协作协议**：\n\n- **取消是协作而非命令**：被取消方自行决定是否响应、如何清理。\n- **中断是协作信号而非异常**：`interrupt()` 只设标志位。设计原则：不知道中断策略就不要中断；阻塞方法要么响应中断，要么明确声明不可中断。\n- **Future / Executor**：把线程管理权从业务逻辑剥离，提供统一的提交、取消、超时与生命周期控制。\n\n## 活跃性的 Java 预防\n\n活跃性失效的原理（死锁 / 活锁 / 饥饿、Coffman 条件）见母篇「进度协调失效」。Java 层的预防手段：\n\n| 问题 | Java 预防手段 |\n| --- | --- |\n| 死锁 | 固定全局加锁顺序、`tryLock(timeout)` 超时放弃、一次性申请、缩小临界区 |\n| 活锁 | 随机退避（重试间隔随机化）、限制重试次数、引入协调者 |\n| 饥饿 | 公平锁 `new ReentrantLock(true)`、避免优先级反转、动态优先级提升 |\n\n> 预防优于检测，设计优于补救。\n\n## JVM 锁优化\n\nJVM 对 `synchronized` 做了一套自动优化，核心是**按竞争程度逐级升级**，避免无谓的重量级开销：\n\n```text\n无锁 → 偏向锁 → 轻量级锁 → 重量级锁\n       (无竞争)  (轻度CAS竞争) (重度竞争挂起)\n```\n\n| 优化 | 作用 |\n| --- | --- |\n| 偏向锁 | 无竞争时偏向首个线程，省去 CAS（注：JDK 15 起默认废弃，JEP 374） |\n| 轻量级锁 | 轻度竞争用 CAS 自旋，不挂起线程 |\n| 自旋 / 自适应自旋 | 短暂忙等避免上下文切换；自适应按历史动态调整自旋次数 |\n| 锁消除 | JIT 判定不可能竞争（如未逸出的局部对象）直接去锁 |\n| 锁粗化 | 把连续的细粒度加锁合并，减少反复加解锁 |\n\n前提：**这些优化只能锦上添花，救不了本身不合理的并发设计**。\n\n## 关联内容（自动生成）\n\n- [/编程语言/并发编程.md](/编程语言/并发编程.md) 并发原理母篇——本文是其在 Java/JVM 上的落地实例\n- [/编程语言/JAVA/JAVA并发编程/基础概念.md](/编程语言/JAVA/JAVA并发编程/基础概念.md) Java 并发基础概念，包括线程生命周期、并发问题等核心知识点\n- [/编程语言/JAVA/JAVA并发编程/线程.md](/编程语言/JAVA/JAVA并发编程/线程.md) Java 中线程的创建、管理与控制机制\n- [/编程语言/JAVA/JAVA并发编程/线程池.md](/编程语言/JAVA/JAVA并发编程/线程池.md) 线程池是高效并发的关键组件，提供线程生命周期管理的高级抽象\n- [/编程语言/JAVA/JAVA并发编程/并发工具类.md](/编程语言/JAVA/JAVA并发编程/并发工具类.md) JUC 同步工具类，是落地并发控制思想的具体手段\n- [/编程语言/JAVA/JAVA并发编程/并发集合.md](/编程语言/JAVA/JAVA并发编程/并发集合.md) 线程安全数据结构，体现实例封闭与线程安全委托模式\n- [/编程语言/JAVA/JVM/JAVA内存模型.md](/编程语言/JAVA/JVM/JAVA内存模型.md) JMM 定义多线程内存访问规则，是可见性、原子性、有序性的基础\n- [/操作系统/进程与线程.md](/操作系统/进程与线程.md) 操作系统层面的进程与线程概念，是理解线程调度与同步的基础\n- [/软件工程/架构/系统设计/高并发.md](/软件工程/架构/系统设计/高并发.md) 高并发系统设计是并发原理的实际应用场景\n- [/编程语言/并发模型.md](/编程语言/并发模型.md) 不同编程语言的并发模型比较，有助于理解 Java 模型的取舍\n- [/计算机网络/IO模型.md](/计算机网络/IO模型.md) IO 模型与并发编程密切相关，尤其在高并发网络场景\n","metadata":"tags: ['并发编程', '编程语言', '操作系统']","hasMoreCommit":true,"totalCommits":44,"commitList":[{"date":"2026-06-04T11:59:43+08:00","author":"MY","message":"docs(java): 重构Java并发编程文档结构并完善核心机制说明","hash":"6250dc29e85424b84bd8bf45fc20bf13ca128801"},{"date":"2026-04-09T15:55:44+08:00","author":"MY","message":"docs(JAVA): 更新Java并发编程文档内容","hash":"11b5912de09ba242385324212dc84911ebabf5dc"},{"date":"2026-02-12T14:07:03+08:00","author":"MY","message":"doc: 整理标签","hash":"290b3e8ad18f48832ac282290238d020fc030a88"},{"date":"2026-01-08T16:50:02+08:00","author":"MY","message":"docs(java): 重构Java并发编程文档结构并完善内容体系","hash":"4b6d89a04a6a81ed082d73bd4e30772492905b8a"},{"date":"2024-11-19T15:26:31+08:00","author":"MY","message":"📦Java 并发编程","hash":"63d98d49e4151c9530896a7a8c1bd0cdc4d9a762"},{"date":"2023-11-24T11:45:52+08:00","author":"MY","message":"📦清理大图","hash":"e3ff900ed2a2e49e9f3bd316935fe853796f7e52"},{"date":"2022-06-29T21:37:26+08:00","author":"MY","message":"✏️更新 处理器体系结构","hash":"66bdeb6527dc0ce151b74584d9fece22a8846dac"},{"date":"2022-04-19T15:48:50+08:00","author":"cjiping","message":"✏️更新 JAVA并发编程","hash":"646d648582446fdbede6731a900b4fe174238fc8"},{"date":"2022-03-17T16:51:46+08:00","author":"cjiping","message":"✏️更新 JAVA并发编程","hash":"7f46c93d6f16638d4ab48bc691902682d024b430"},{"date":"2022-03-16T17:11:49+08:00","author":"cjiping","message":"✏️更新 JAVA 并发编程","hash":"1c82a1f8cf61fee93f518eedcc38c0190ad11c56"}],"createTime":"2019-09-16T09:09:52+08:00"}