为了账号安全,请及时绑定邮箱和手机立即绑定

【zookeeper系列一】zookeeper实现分布式锁?

标签:
Java

主要使用的zk的临时顺序节点概念,创建临时节点,并且是有序的,多线程在某个节点下创建同一个名称的节点,产生的有序节点。

 

什么是临时顺序节点,例如:

第一个客户端在produce目录下创建一个临时节点key为order,zk内部会给起个名字叫做:order-000001。

第二个客户端来也要创建一个临时节点在produce目录下,节点的key也是order,zk会起个名字叫做:order-000002数字都是依次递增的,从1开始逐次递增。zk会维护这顺序

 

 

 

创建节点:获取锁的过程:

 

第一步:创建一个临时顺序节点

第二步:获取当前目录下的所有临时顺序节点(不考虑当前目录下存在多个不同的key)

第三步:获取排序第一的临时节点

第四步:比较当前线程创建的临时节点和排序第一的节点是否相等,若相等当前线程获取锁。

第五步:若不相等,当前线程监听自己前面的一个节点(比自己序号小1的节点)。

 

 

https://img4.sycdn.imooc.com/605c3e220001fd9a07330312.jpg


 

第六步:若线程A释放锁,删除当前临时节点(删除排序第一的节点)

 

https://img3.sycdn.imooc.com/605c3e230001495708720443.jpg


 

 

 

 

第七步:线程B再回到第二步,试着去获取锁(排序第一个已经删除,剩下的就是排序第一的)

 

 

https://img2.sycdn.imooc.com/605c3e24000172be08780485.jpg


 

 

其实如果有客户端C、客户端D等N个客户端争抢一个zk分布式锁,原理都是类似的。

 

1,大家都是上来直接创建一个锁节点下的一个接一个的临时顺序节点

 

2,如果自己不是第一个节点,就对自己上一个节点加监听器

 

3,只要上一个节点释放锁,自己就排到前面去了,相当于是一个排队机制。

 

而且用临时顺序节点的另外一个用意就是,如果某个客户端创建临时顺序节点之后,不小心自己宕机了也没关系,zk感知到那个客户端宕机,会自动删除对应的临时顺序节点,相当于自动释放锁,或者是自动取消自己的排队。

最后,咱们来看下用Curator框架进行加锁和释放锁的一个过程:

 

https://img1.sycdn.imooc.com/605c3e240001bb7505370284.jpg


其实用开源框架就是这点好,方便。这个Curator框架的zk分布式锁的加锁和释放锁的实现原理,其实就是上面我们说的那样子。

但是如果你要手动实现一套那个代码的话。还是有点麻烦的,要考虑到各种细节,异常处理等等。所以大家如果考虑用zk分布式锁,

来源:https://mp.weixin.qq.com/s/fqtS2tYPaK6cAsqtcdbM-Q

作者:一起写程序

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
33
获赞与收藏
206

关注作者,订阅最新文章

阅读免费教程

  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消