使用各种锁的过程中由于种类太多分不清各种锁到底是什么层面的、底层逻辑有很多很像但是为什么要有这么多种下面按不同视角进行区分视角 1【作用域视角】JVM 内锁进程内锁同一个 JVM多线程之间。 synchronized、ReentrantLock、读写锁、StampedLock、Semaphore、CAS数据库锁数据库引擎层面数据库服务内部多个事务之间。 表锁、行锁、间隙锁、临键锁、意向锁、MDL 元数据锁、全局锁分布式锁跨进程 / 跨机器多个不同 JVM、不同服务实例、集群之间互斥。 Redis 锁、ZK 锁、etcd 锁、数据库实现的分布式锁视角 2【并发思想视角悲观 / 乐观】悲观锁默认一定会发生并发冲突访问资源前先上锁阻止别人进来。JVMsynchronized、ReentrantLockMySQLfor update 行 X 锁、lock in share mode 行 S 锁、表锁分布式Redis/ZK 分布式锁乐观锁认为冲突很少不上阻塞锁提交的时候校验冲突失败重试。JVMCASAtomic 系列、LongAdderMySQL业务 version 版本号乐观锁视角 3【访问权限视角共享 / 排他】锁的行为规则定义拿到锁之后其他人能不能读 / 写排他锁X 锁写锁持有者独占别人读、写全部阻塞 synchronized、ReentrantLock、for update 行锁、MDL 写锁、Redis 分布式锁共享锁S 锁读锁多个持有者可以同时持有写操作会阻塞 ReentrantReadWriteLock 读锁、lock in share mode、MDL 读锁组合读写锁 一把锁内部包含「共享读锁 排他写锁」视角 4【锁粒度视角】数据库锁专属视角控制锁多少数据只用于 MySQL InnoDB全局锁锁整个实例所有表表级锁锁整张表普通表 S/X 锁、意向锁 IS/IX、MDL 元数据锁行级锁锁索引记录记录锁 Record Lock锁一条记录间隙锁 Gap Lock锁索引之间的空隙RR 级别防幻读临键锁 Next-Key Lock 记录锁 间隙锁RR 默认行锁算法视角 5【锁的能力特性视角】附加属性所有锁通用标签这一组是属性标签给锁打勾不是分类。可重入同一个持有者可以多次加锁synchronized、ReentrantLock、Redisson 锁 ✅StampedLock、原生 ZK 锁 ❌公平 / 非公平公平 排队先来先得非公平 允许插队吞吐更高可中断等待锁的时候可以响应线程中断ReentrantLock ✅synchronized ❌支持超时获取tryLock (time)拿不到锁不等了视角 6【实现层面内核锁 vs 业务逻辑锁】底层内核锁操作系统 / JVM / 数据库引擎原生提供操作系统内核参与阻塞。 synchronized、ReentrantLock、MySQL 行锁表锁业务逻辑锁没有底层阻塞锁完全靠业务代码、中间件 API 实现。 CAS、版本号乐观锁、Redis 分布式锁、ZK 分布式锁关键理解不要把「视角」和「锁实体」混在一起举个例子拆解你感受多维标签InnoDB Next-Key 临键锁视角 1作用域数据库锁视角 2思想悲观锁视角 3权限排他锁视角 4粒度行锁Next-Key特性不可重入只在 RR 隔离级别生效
