文章目录先说结论锁的分类维度核心理解同一把锁可以有多个身份维度一加锁策略——乐观 vs 悲观维度二公平性——公平 vs 非公平维度三重入性——可重入 vs 不可重入维度四排他性——独占 vs 共享维度五等待方式——自旋 vs 阻塞维度六synchronized 的 JVM 优化级别并发锁分类全景回答技巧与点评标准回答加分回答面试官点评个人网站学 Java 并发的时候锁的名字像撒豆子一样蹦出来乐观锁、悲观锁、公平锁、非公平锁、可重入锁、独占锁、共享锁、自旋锁、偏向锁、轻量级锁……你越学越晕感觉每把锁都是独立的根本串不起来。其实这些锁不是并列关系而是从不同维度给同一把锁起的名字。今天咱们就把这团乱麻理清楚。先说结论锁的分类维度||| 分类维度 | 锁类型 | 说明 ||||------|------|------|||| 加锁策略 | 乐观锁 / 悲观锁 | 加锁前是否假设冲突 |||| 公平性 | 公平锁 / 非公平锁 | 是否按等待顺序获取 |||| 重入性 | 可重入锁 / 不可重入锁 | 同一线程能否重复获取 |||| 排他性 | 独占锁排他锁/ 共享锁 | 是否只允许一个线程持有 |||| 等待方式 | 自旋锁 / 阻塞锁 | 等锁时是自旋还是挂起 |||| 锁粒度 | 偏向锁 / 轻量级锁 / 重量级锁 | synchronized 的 JVM 优化级别 |一句话记住锁的分类就像给人分类——按性别分、按年龄分、按职业分同一个人可以同时属于多个分类。核心理解同一把锁可以有多个身份这是最关键的一点——一把锁可以同时属于多个分类维度。比如ReentrantLock它是悲观锁加锁才访问它是可重入锁同线程可重复获取所以叫 Reentrant它可以是公平锁或非公平锁构造参数决定它是独占锁同一时刻只有一个线程持有它等待时是阻塞锁park 挂起不是自旋就像一个人可以同时是男生、90后、程序员——这些标签不冲突只是分类维度不同。生活类比你去买车销售说这是自动挡、SUV、白色、七座。自动挡 vs 手动挡是一个维度SUV vs 轿车是另一个维度颜色是第三个维度——它们描述的是同一辆车的不同方面。维度一加锁策略——乐观 vs 悲观这是思想层面的分类悲观锁先锁再说认为冲突一定发生 →synchronized、ReentrantLock乐观锁先干后验认为冲突概率低 → CAS、版本号这个维度和后面的维度完全正交。一把悲观锁可以同时是公平锁、可重入锁、独占锁——不矛盾。维度二公平性——公平 vs 非公平这是排队策略的分类公平锁先来先得按等待顺序获取 →new ReentrantLock(true)非公平锁允许插队直接 CAS 抢 →new ReentrantLock(false)默认只有涉及排队的锁才有公平性概念。乐观锁CAS不存在排队所以没有公平/非公平的说法。维度三重入性——可重入 vs 不可重入这是同线程行为的分类可重入锁同线程可重复获取同一把锁 →synchronized、ReentrantLock不可重入锁同线程重入会死锁 → 实际很少使用Java 中主流锁基本都是可重入的不可重入锁属于特殊场景如某些自旋锁实现。维度四排他性——独占 vs 共享这是多线程行为的分类独占锁排他锁同一时刻只有一个线程持有 →synchronized、ReentrantLock共享锁同一时刻多个线程可同时持有 →ReentrantReadWriteLock.ReadLock、SemaphoreReentrantReadWriteLock最有意思——读锁是共享锁写锁是独占锁。读读不互斥读写互斥写写互斥。维度五等待方式——自旋 vs 阻塞这是等锁行为的分类自旋锁等锁时 CPU 空转不释放时间片 → CAS 自旋阻塞锁等锁时线程挂起park让出 CPU →synchronized重量级锁、ReentrantLock自旋锁适合锁持有时间极短的场景——等一小会儿就拿到了比挂起再唤醒快。但如果锁持有时间长自旋就是白白浪费 CPU。synchronized的轻量级锁阶段就是自旋膨胀为重量级锁后变为阻塞。所以synchronized其实两种都用了。维度六synchronized 的 JVM 优化级别这是synchronized独有的锁升级过程偏向锁只有一个线程访问连 CAS 都不做直接标记轻量级锁短时间竞争CAS 自旋重量级锁竞争激烈操作系统互斥量线程阻塞锁只能升级不能降级严格说偏向锁可以批量撤销。这是 JVM 帮你自动做的优化代码层面无感知。并发锁分类全景Java 并发锁分类 全景 按加锁策略 ├── 乐观锁 ── CAS、版本号 └── 悲观锁 ── synchronized、ReentrantLock 按公平性 ├── 公平锁 ── ReentrantLock(true) └── 非公平锁 ── ReentrantLock(false)、synchronized 按重入性 ├── 可重入锁 ── synchronized、ReentrantLock └── 不可重入锁 ── 极少使用 按排他性 ├── 独占锁 ── synchronized、ReentrantLock、WriteLock └── 共享锁 ── ReadLock、Semaphore、CountDownLatch 按等待方式 ├── 自旋锁 ── CAS 自旋 └── 阻塞锁 ── synchronized重量级、ReentrantLock synchronized 锁升级 偏向锁 → 轻量级锁自旋 → 重量级锁阻塞 关键理解 一把锁可同时属于多个维度维度之间正交不互斥 口诀乐观悲观加锁策公平排队谁先得 重入自旋独占共维度正交要分清。回答技巧与点评标准回答Java 并发锁可以从多个维度分类按加锁策略分为乐观锁和悲观锁按公平性分为公平锁和非公平锁按重入性分为可重入锁和不可重入锁按排他性分为独占锁和共享锁按等待方式分为自旋锁和阻塞锁。这些维度是正交的同一把锁可以同时属于多个维度。比如 ReentrantLock 既是悲观锁、可重入锁、独占锁又可以是公平锁或非公平锁。加分回答设计思想锁的分类本质是关注点分离——每个维度解决一个特定问题。乐观/悲观解决要不要加锁公平/非公平解决排队策略独占/共享解决并发度。理解维度而非记名字才能真正选对锁边界情况有些锁的组合是不存在的。比如乐观锁没有公平/非公平之分CAS 没有排队不可重入的悲观锁在 Java 中极少使用会自我死锁。synchronized 的锁升级是不可逆的只升不降实际应用选锁时按维度逐个决策——先选乐观/悲观看竞争程度再选公平/非公平看是否需要严格顺序再选独占/共享看是否允许多线程同时读最后选等待方式看锁持有时间长短面试官点评这道题考的是你对锁的体系化认知。把所有锁名罗列一遍只能拿基础分。能说清同一把锁可以属于多个分类维度这个核心认知逐维度展开才是面试官想听的。如果你能现场画出分类图并指出哪些组合不存在面试官会非常认可。原文阅读内容有帮助点赞、收藏、关注三连评论区等你