# java_maven_lock **Repository Path**: enzoism/java_maven_lock ## Basic Information - **Project Name**: java_maven_lock - **Description**: java_maven_lock - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-04 - **Last Updated**: 2026-09-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Java 锁机制实战 —— 系列总览 > 「Java 锁机制实战」系列配套代码:`src/main/java/com/spring/concurrent/`(JDK 17,每个 Demo 类都有可独立运行的 `main`) > 内容素材:`20260904Java多线程锁机制.md` 从简单到复杂、从悲观到乐观,一条演进主线贯穿全系列: > **内置**(synchronized)→ **显式**(ReentrantLock)→ **读写分离**(ReadWriteLock)→ **乐观读**(StampedLock)→ **无锁**(CAS) 功能越来越细,性能越来越高,复杂度也越来越大。 --- ## 系列导航 | 篇目 | 主题 | 一句话核心 | 博客正文 | |------|------|-----------|---------| | 第 1 篇 | synchronized 内置锁 | JVM 层面对象锁,隐式、自动、可重入,像"自动门" | [a01synchronized](src/main/java/com/spring/concurrent/a01synchronized/README.md) | | 第 2 篇 | ReentrantLock 显式锁 | 手动挡:可中断、可超时、可公平、多 Condition 精准唤醒 | [a02ReentrantLock](src/main/java/com/spring/concurrent/a02ReentrantLock/README.md) | | 第 3 篇 | ReadWriteLock 读写锁 | 读者并行、写者独占,读多写少场景的图书馆模式 | [a03ReadWriteLock](src/main/java/com/spring/concurrent/a03ReadWriteLock/README.md) | | 第 4 篇 | StampedLock 乐观读 | 先赌一把再补锁,"先上车后补票",读性能更进一步 | [a04StampedLock](src/main/java/com/spring/concurrent/a04StampedLock/README.md) | | 第 5 篇 | CAS 与原子类 | 硬件加速的无锁编程:先比较再交换,失败就重试 | [a05CASAtomic](src/main/java/com/spring/concurrent/a05CASAtomic/README.md) | | 第 6 篇 | 全景对比与选型(完结) | 五篇收束成一张地图 + 一棵选型决策树 | [a06LockSummary](src/main/java/com/spring/concurrent/a06LockSummary/README.md) | --- ## 一、锁的分类总览 ``` Java锁机制 ├── 内置锁 │ └── synchronized(JVM层面) ├── 显式锁(JUC包) │ ├── ReentrantLock(可重入排他锁) │ ├── ReentrantReadWriteLock(读写锁) │ └── StampedLock(乐观读 + 悲观写) ├── 无锁/乐观锁 │ └── CAS + 原子类(AtomicXXX) ├── 并发控制工具 │ ├── Semaphore(信号量,限流) │ ├── CountDownLatch(一次性等待) │ └── CyclicBarrier(循环栅栏) └── 底层支撑 └── LockSupport(park/unpark) ``` 常见的分类维度: | 分类维度 | 具体划分 | |---------|---------| | 接口/关键字 | `synchronized`、`ReentrantLock`、`ReadWriteLock`、`StampedLock` | | 语义/机制 | 偏向锁、轻量级锁、重量级锁(JVM 层面,作理论基础,简要提及) | | 公平性 | 公平锁 vs 非公平锁 | | 共享/独占 | 共享锁(读)vs 独占锁(写) | | 乐观/悲观 | 乐观锁(CAS)vs 悲观锁 | | 自旋 | 自旋锁(CAS 循环重试) | --- ## 二、核心对比总结 | 锁/工具 | 锁类型 | 可重入 | 公平性 | 阻塞/非阻塞 | 适用场景 | | ------- | ------ | ------ | ------ | ----------- | -------- | | `synchronized` | 排他锁 | ✅ | 非公平 | 阻塞 | 简单同步,代码简洁 | | `ReentrantLock` | 排他锁 | ✅ | 可选公平 | 阻塞 | 需要超时、中断、条件队列 | | `ReadWriteLock` | 读写锁 | ✅ | 可选公平 | 阻塞 | 读多写少 | | `StampedLock` | 读写+乐观读 | ❌ | 非公平 | 阻塞/非阻塞 | 读极多写极少,追求性能 | | `CAS/Atomic` | 乐观无锁 | — | — | 非阻塞自旋 | 简单计数、低竞争 | | `Semaphore` | 共享许可 | — | 可选公平 | 阻塞 | 资源池限流 | | `CountDownLatch` | 协作工具 | — | — | 阻塞 | 等待多任务完成 | | `CyclicBarrier` | 协作工具 | — | — | 阻塞 | 多线程分阶段协作 | 各方案的优缺点速查: | 锁类型 | 优点 | 缺点 | | ------ | ---- | ---- | | `synchronized` | 简单、自动释放、不会忘记解锁 | 不可中断、不可超时(JDK 6 后性能已大幅优化) | | `ReentrantLock` | 灵活(可中断/超时/公平)、功能全 | 必须显式 unlock,易出错 | | `ReadWriteLock` | 读并发高 | 写饥饿风险(读多写少时收益才明显) | | `StampedLock` | 乐观读性能极佳(无阻塞) | 不可重入、不支持 Condition、代码复杂 | | `Semaphore` | 控制并发总量 | 非真正互斥锁 | | CAS(自旋) | 无锁、轻量、无上下文切换 | ABA 问题、高竞争下自旋耗 CPU | --- ## 三、选型决策树 ``` 需要锁吗? └─ 简单场景 → synchronized(自动省心) → 第 1 篇 └─ 需要中断/超时/公平 → ReentrantLock → 第 2 篇 └─ 读多写少? ├─ 一般读多 → ReadWriteLock → 第 3 篇 └─ 读极多、性能敏感 → StampedLock(乐观读) → 第 4 篇 └─ 只是计数/简单操作 → Atomic + CAS → 第 5 篇 └─ 控制并发数量 → Semaphore → 第 6 篇 Demo02 └─ 等大家一起 → CountDownLatch / CyclicBarrier → 第 6 篇 Demo02 ``` --- ## 四、记忆技巧 🧠 ### 口诀一:锁的演进路线 > **"内置显式读写乐观,无锁协作层层递进"** ### 口诀二:关键区别速记 | 对比 | 记忆法 | | ---- | ------ | | `synchronized` vs `ReentrantLock` | **自动门 vs 手动门**(一个自动开关,一个自己操作但功能多) | | `ReadWriteLock` vs `StampedLock` | **正经读书 vs 偷看赌一把**(一个上来就加锁,一个先读再看变没变) | | `CountDownLatch` vs `CyclicBarrier` | **发令枪 vs 聚餐**(一个一次性,一个能反复用) | | CAS 的 ABA 问题 | **狸猫换太子**(值还是 A,但中间被换成 B 又换回 A;带版本号能识破) | ### 生活类比速查 | 锁类型 | 现实类比 | | ------ | -------- | | `synchronized` | 公共厕所门锁(进去关门,出来自动开) | | `ReentrantLock` | 智能门锁(可设超时、可中断、可记录谁在用) | | `ReadWriteLock` | 图书馆(多人看书不冲突,但整理书架时只能一人) | | `StampedLock` | 抄作业(先快速瞄一眼,发现被改再认真读) | | `Semaphore` | 餐厅限流 / 停车场(同时只接待 N 桌/停 N 辆) | | CAS | 抢红包(想改的值,得先确认中间没人动过) | ### 避坑口诀 > **"锁范围尽量小,锁持有尽量短;能无锁不用锁,能读锁不写锁;unlock 放 finally,死锁要避免"** > **"锁要 finally 放,公平慎用防饥饿,乐观读要验戳,CAS 注意 ABA"** --- ## 五、运行方式 ```bash # 编译整个工程 mvn compile # 运行任意一个 Demo(示例) java -cp target/classes com.spring.concurrent.a01synchronized.Demo01_Basic ``` 也可以在 IDEA 中直接打开任意 `Demo` 类,点击 `main` 方法左侧的运行按钮。 建议按系列顺序阅读博客(每篇 `README.md`),并对照运行该篇的 Demo,观察输出中的**线程次序与总耗时**——那是互斥与否最直观的证据。