简单俩聊分布式锁的

现在面试很多人都会被问到分布式锁这个问题。 在并发访问下, 如果我们的代码不加锁的话,是会出问题的, 下面就以秒杀为例,
在秒杀数量-- 的时候, 如果没有加锁的话肯定是会出问题的, 这个我们都知道。
方案一:
synchronized 加锁的话, 单机的问题就可以被解决了。
但是, 在分布式的服务情况下, 跨jvm 的, synchronized 这种方式就会失效
方案二: 讲锁提取出来,比较流行的就是用redis ,mysql ,zookeeper,等
这里俩聊redis 。
可以用redis 的 setnx (“lock”,“xxx”)设置锁,setnx 就是原来有之的话就失败, 如果设置成功了, 相当于获取了锁, 执行操作, 最后fainlly(){讲锁删除},释放锁
优化方案二 1.: 上面存在一个问题, 如果获取了锁, 在执行的过程中挂了, 我们的锁就锁死了, 释放不了, 这里考虑设置一个过期时间,如果过期了就释放锁。
优化方案二 2.: 上面的时间设置多久合适呢, 比如设置10s, 服务运行需要12s, 那我们的锁就会提早被释放,那么线程跟锁就会不匹配, 前面的线程甚至会把后面的线程的锁给释放了, 逻辑代码块会有多个线程在运行。
优化方案二 3.: 根据上面的问题 , 如果我们能分出一个子线程来过几秒过来看看我们的线程有没有执行完。如果没执行完就给锁续命。 自己来做的话又很容易出坑, 所以这里采用现成的,
redis 给我们提供了专门用于处理分布式锁的技术, redission 获取lock , 然后用 lock , unlock, 三行代码搞定。具体的实现就不上代码了, 上个连接
https://www.cnblogs.com/yangzhilong/p/7605807.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值