库存超卖问题的解决思路 + 悲观锁与乐观锁

常见方案

悲观锁,

  • 认为线程安全问题一定会发生,
  • 因此操作数据库之前都需要先获取锁,确保线程串行执行。
  • 常见的悲观锁有:synchronized、lock

乐观锁,

  • 认为线程安全问题不一定发生,
  • 因此不加锁,
  • 只会在更新数据库的时候去判断有没有其它线程对数据进行修改,
    • 如果没有修改则认为是安全的,直接更新数据库中的数据即可,
    • 如果修改了则说明不安全,直接抛异常或者等待重试。
  • 常见的实现方式有:版本号法、CAS操作、乐观锁算法

悲观锁和乐观锁的对比

悲观锁比乐观锁的性能低:

  • 悲观锁需要先加锁再操作,
  • 而乐观锁不需要加锁,所以乐观锁通常具有更好的性能。

悲观锁比乐观锁的冲突处理能力低:

  • 悲观锁在冲突发生时直接阻塞其他线程,
  • 乐观锁则是在提交阶段检查冲突并进行重试。

悲观锁比乐观锁的并发度低:

  • 悲观锁存在锁粒度较大的问题,可能会限制并发性能;
  • 而乐观锁可以实现较高的并发度。

应用场景:

  • 两者都是互斥锁,
  • 悲观锁适合写入操作较多、冲突频繁的场景;
  • 乐观锁适合读取操作较多、冲突较少的场景。
posted @ 2025-04-10 12:56  kuki'  阅读(49)  评论(0)    收藏  举报