排他锁同一时刻仅能被一个线程持有,禁止其他线程加任何锁;共享锁可被多个线程同时持有,但会阻止排他锁获取。前者支持读写,后者仅允许读操作。

排他锁和共享锁的区分不看名字,而看“能不能同时被多个线程持有”这个核心行为。
看能否并发持有
这是最直接、最本质的判断依据:
- 排他锁(独享锁/写锁):同一时刻只能被一个线程持有。一旦线程A加了排他锁,其他线程既不能加排他锁,也不能加共享锁,必须等A释放后才能尝试。
- 共享锁(读锁):同一时刻可被多个线程同时持有。线程A加了共享锁后,线程B、C等仍可成功加共享锁,但谁都无法再加排他锁。
看典型实现类
Java中常见锁的归属很明确,记住几个关键例子即可:
- 排他锁:synchronized关键字、ReentrantLock、ReentrantReadWriteLock.WriteLock、MySQL的X锁(写锁)。
- 共享锁:ReentrantReadWriteLock.ReadLock、MySQL的S锁(读锁)。
看操作权限
锁类型也反映在线程获得锁后的操作能力上:
- 拿到排他锁的线程,既能读也能写,具备完全控制权。
- 拿到共享锁的线程,只能读,不能修改数据;否则就破坏了“多读不互斥”的前提。
注意分类维度别混淆
排他/共享是按“持有方式”划分的,和公平/非公平(按获取顺序)、悲观/乐观(按冲突假设)、可重入/不可重入(按重入能力)不在同一层。比如ReentrantReadWriteLock的ReadLock是共享+可重入+默认非公平,WriteLock是排他+可重入+默认非公平——它们可以组合存在。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











