49、分布式锁(redis分布式锁误删问题)
解决思路:我们释放的锁的时候进行一个判断(判断锁的标识是否一致(可以存线程id(jvm提供)作为标识(uuid更好。分布式场景有多个jvm)))优化后的逻辑:(可以存一个线程id作为锁的标识。释放锁前先判断一下)以前释放锁的逻辑:(随意释放锁,没有判断这个锁是不是自己的)优化后的业务流程:(加了锁的标识,删除锁前先判断下标识)
·
分布式锁(redis分布式锁误删问题)
!!!!情况1:
- 线程1出现阻塞(阻塞时间太长了,超过了我们的锁的超时时间),也就是说线程1这业务还没完成,redis锁就超时释放了。
- 那么线程2就可以去获取这个锁了,获取完成后执行业务。但是这时线程1阻塞时间到了(业务完成了)。线程1就去直接释放了redis锁了。但是他这里释放的是线程2的锁了(线程2还不知道呢,在哼哧哧的执行业务呢)。
- 这时线程3发现线程2的锁被释放了,也进来获取锁执行业务了。此时就会有线程2和线程3在并发执行了(出现了并发安全问题)
- 问题:线程1因为阻塞误删了线程2的锁
- 解决思路:我们释放的锁的时候进行一个判断(判断锁的标识是否一致(可以存线程id(jvm提供)作为标识(uuid更好。分布式场景有多个jvm)))
3、以前的业务流程:
优化后的业务流程:(加了锁的标识,删除锁前先判断下标识)
以前释放锁的逻辑:(随意释放锁,没有判断这个锁是不是自己的)
优化后的逻辑:(可以存一个线程id作为锁的标识。释放锁前先判断一下)
更多推荐
所有评论(0)