分布式锁有多种实现方式,比如通过数据库,redis都可以实现,作为分布式协同工具zookeeper也有着标准的实现方式.
设计思路:
- 每个客户端往/Locks下创建临时有序节点/Locks/Lock_,创建成功之后/Locks下面会有每个客户端对应的节点,如/Locks/Lock_0000000001
- 客户端取得/Locks下子节点,并进行排序,判断最前面的是否为自己,如果自己的锁节点在第一位,代表获取锁成功.
- 如果自己的锁节点不在第一位,则监听自己前一位的锁节点,例如自己锁节点Lock_000000002,那么监听Lock_000000001
- 当前一位锁节点(Lock_000000001)对应的科技迪阿敏执行完毕,释放了锁,将会触发监听客户端(Lock_000000002)的逻辑
- 监听客户端重新执行第二步逻辑,判断自己是否获得了锁
zookeeper的分布式唯一id以及分布式配置中心的案例github链接 欢迎star
代码如下
package com.sofency.top;
import org.apache.zookeeper.*;