库存超卖问题的解决思路 + 悲观锁与乐观锁
常见方案
悲观锁,
- 认为线程安全问题一定会发生,
- 因此操作数据库之前都需要先获取锁,确保线程串行执行。
- 常见的悲观锁有:synchronized、lock
乐观锁,
- 认为线程安全问题不一定发生,
- 因此不加锁,
- 只会在更新数据库的时候去判断有没有其它线程对数据进行修改,
- 如果没有修改则认为是安全的,直接更新数据库中的数据即可,
- 如果修改了则说明不安全,直接抛异常或者等待重试。
- 常见的实现方式有:版本号法、CAS操作、乐观锁算法
悲观锁和乐观锁的对比
悲观锁比乐观锁的性能低:
- 悲观锁需要先加锁再操作,
- 而乐观锁不需要加锁,所以乐观锁通常具有更好的性能。
悲观锁比乐观锁的冲突处理能力低:
- 悲观锁在冲突发生时直接阻塞其他线程,
- 乐观锁则是在提交阶段检查冲突并进行重试。
悲观锁比乐观锁的并发度低:
- 悲观锁存在锁粒度较大的问题,可能会限制并发性能;
- 而乐观锁可以实现较高的并发度。
应用场景:
- 两者都是互斥锁,
- 悲观锁适合写入操作较多、冲突频繁的场景;
- 乐观锁适合读取操作较多、冲突较少的场景。

浙公网安备 33010602011771号