360免费建站域名,校园网站建设管理办法,公司建设网站的公司,网页设计案例100例业务场景#xff1a;多个线程对共同资源的访问#xff1a;库存超卖/用户重复下单的原因
解决方法一#xff1a;利用jvm内置锁#xff0c;将非原子性操作变成原子性操作 Synchronized锁的是对象#xff0c;对象必须是单例的。锁的是this,代表当前所在的类#xff0c;这个…业务场景多个线程对共同资源的访问库存超卖/用户重复下单的原因
解决方法一利用jvm内置锁将非原子性操作变成原子性操作 Synchronized锁的是对象对象必须是单例的。锁的是this,代表当前所在的类这个类是交给Spring 管理的。所有以是单例模式的所以可以锁住 为什么在分布式项目中不使用synorchronized同步锁
因为jvm的synorchonized只能保证自己的服务在集群部署的时候有多个服务锁不住jvm服务。jvm的内置锁只能解决单体式项目中的并发问题但是在分布式环境下无法解决多jvm实例的并发。
分布式锁的实现
分布式事务锁的要素
锁哪个对象 锁指定场次下的指定商品当多线程同时加锁时只能有一个线程加锁成功Redis的setnx命令。例如使用setnx秒杀场次秒杀商品id锁记录在什么地方 利用redis的setnx命令存储在Redis的String数据结构中当线程获取不到锁的时候执行什么策略 阻塞/自旋等待限制次数/直接抛异常 Finally 释放锁 这么写会造成锁的问题
如果加完redis的key以后程序挂了那么这个key就释放不了就会一直在里面会造成死锁解决方式——设置超时时间
但是存键值和设置超时时间是两个操作不是一个完整的原子性操作
利用LUA脚本进行操作定义加载lua脚本的配置
在resource下面新建lua脚本 在代码中执行lua脚本保证命令的原子性