1、业务单机情况下
问题:并发没有加锁导致线程安全问题。
解决方法:加锁处理,如lock、synchronized
仍有问题:业务分布式情况下,代码级别加锁已经无效。需要借助第三方组件,如redis、zookeeper。
2、业务分布式情况下,使用redis的setNX,实现加锁解锁,保证业务前加锁,业务后解锁。
问题:1、业务异常导致解锁失败 2、机器异常导致解锁失败
解决方案:对于1、try/finally finally中解锁 2、加锁时key添加超时时间
引入新的问题:1、需要保证加锁和超时操作的原子性 2、业务运行超过超时时间,导致解锁了其他线程的锁 3、超时时间
3、分布式锁实现过程中遇到的问题
问题:1、需要保证加锁和超时操作的原子性 2、业务运行超过超时时间,导致解锁了其他线程的锁
解决方案:对于1、加锁命令同时设置超时 2、加锁前生成唯一uuid,锁value用该uuid,解锁时判断uuid是否相等。
仍有问题:1、比对uuid和解锁的过程不是原子的 2、业务运行未结束,锁提前释放
4、分布式锁实现过程中遇到的问题、
问题:1、比对uuid和解锁的过程不是原子的 2、业务运行未结束,锁提前释放
解决方案:对于1、使用lua脚本 2、看门狗机制,实现锁续期
5、自己实现不如使用分布式锁实现方案Redisson