案例:多个用户同时购买数量为1的商品,所以只能有一个购买成功
- 不加锁
会重复购买
- 乐观锁,加字段处理,在并发少的时候可以使用
加版本号字段,第一次查询数量的时候读取到版本号,更新数量时用同样的版本号更新并更新版本号,如果有其它用户先购买成功了,版本号就会变化了,这样别的用户就不会购买成功了。
- 悲观锁,在方法上加synchronized关键字修饰,单机部署模式可用,集群模式不可用
synchronized关键字在Java中是基于JVM层面的锁机制,因此在集群环境下不适用于跨多个 JVM 实例的并发控制。在集群环境中,每个 JVM 实例都有自己的锁空间,无法跨 JVM 实例进行锁同步。
- Lock锁,和synchronized效果一样,只有在单机模式下可以保证没问题,而集群模式下依然会出现问题
- 使用 Redisson 来实现分布式锁
S在配置文件中添加Redisson配置,添加Redisson配置类,即可在代码中获取使用,最后需解锁,如果在获取锁之后服务挂掉也不会造成死锁。