
高并发超卖问题及解决方案
从并发扣减库存的竞态条件出发,对比悲观锁与乐观锁解决超卖问题的思路和取舍。
超卖问题
什么是超卖问题
此时有两个线程,线程1查询到库存还有一个,然后线程1开始扣减库存,由于是高并发场景,线程2在线程1没有开始扣减库存时也查到了还有一个库存,于是也开始扣减库存,造成了超卖问题。
解决方案:
悲观锁
- 含义:简单来说,悲观锁认为数据冲突一定会发生,在一个线程修改数据前将其锁定,然后操作成功后释放锁,以确保数据的一致性和完成性
- 实践:在Java中,常见的悲观锁实现是使用
synchronized关键字或ReentrantLock类。 - 优点:绝对安全,能够确保数据的完整性和一致性
- 缺点:阻塞其他线程,效率低下,容易造成死锁。
乐观锁
- 含义:简单来说,乐观锁认为数据冲突大概路不会发生,先操作数据,再进行检查。
- 实践:在每次更新数据时,先获取当前数据的版本号或时间戳,然后在更新时比对版本号或时间戳是否一致,若一致则更新成功,否则表示数据已被其他线程修改,更新失败。
- 优点:无锁无阻塞,并发性能高。
- 缺点:需扩展额外字段,增加内存空间。


