为什么synchronized不可以?
synchronized锁是jvm进程级别锁。
在集群分布式下:
每一个tomat应用都是一个jvm进程。
SETNX
模拟场景代码
如果出现异常,把释放锁 放进finally代码块。
同一时刻多个请求过来的时候,只有一个请求会返回ture,因为redis是单线程的特性。
其他请求 返回:当前人数过多,请稍微再试;
问题一
redis是单线程,web服务挂掉后,finally代码块的锁始终无法释放,导致其他请求也无法进行
解决:
增加key的过期时间
问题二
超时时间设置成功之前出现了bug怎么处理
解决:把设置值和超时时间绑定在一起
问题三
高并发场景下存在的问题,前面线程释放了后面线程刚加的锁。B线程自己加的锁被A线程给释放了。
解决方法:
每一个线程设置一个uuid,并将uuid作为redis的value;那么在释放锁的时候先判断是不是自己线程的锁,如果是再释放
详情点击redis分布式锁实现场景