加载中...
乐观锁与悲观锁是并发控制的两种思路。悲观锁假设冲突常发生,操作前先加锁独占;乐观锁假设冲突很少,不加锁而在提交时检测数据是否被改动,通过版本号或 CAS 实现。二者适用于不同的读写比例场景。

| 类型 | 并发控制策略 |
| 悲观锁假设 | 冲突常发生 |
| 乐观锁假设 | 冲突很少 |
| 乐观锁实现 | 版本号、CAS |
| 适用区分 | 读写比例与冲突率 |
乐观锁与悲观锁是处理并发访问共享数据时的两种基本策略,核心区别在于对冲突发生概率的假设不同,以及由此选择的加锁时机不同。它们广泛应用于数据库、缓存和并发编程之中。
当多个线程或事务同时读写同一份数据时,可能产生更新丢失、脏读等问题。为保证数据正确,需要并发控制。悲观锁走保守路线,认为冲突随时会发生,因此在操作数据前就先加锁;乐观锁走乐观路线,认为冲突罕见,先不加锁,直到提交时才检查数据是否被别人改过。
问:乐观锁一定比悲观锁性能好吗?答:不一定。在冲突很少时乐观锁避免了加锁开销,性能更好;但在高冲突场景下会频繁重试,反而浪费资源,此时悲观锁更稳妥。选择取决于实际的读写比例和冲突频率。
问:乐观锁如何解决 ABA 问题?答:仅比较值可能出现值被改回原样导致误判成功的 ABA 问题。通过引入版本号或带标记的原子引用,让每次修改都改变版本,即可识别中间发生过的变化。

| 类型 | 并发控制策略 |
| 悲观锁假设 | 冲突常发生 |
| 乐观锁假设 | 冲突很少 |
| 乐观锁实现 | 版本号、CAS |
| 适用区分 | 读写比例与冲突率 |
登录 后参与讨论
暂无讨论,来发表第一条评论吧