// 连接到 zookeeper
ZooKeeper zooKeeper new ZooKeeper(zookeeperUrl, LOCK_WAIT_TIME, this);
// 判断 ZK分布式锁父节点是否已经存在
Stat flag zooKeeper.exists(ZK_LOCK_PATH, false);
if (flag null){
// 父节点不存在 则创建
zooKeeper.create(ZK_LOCK_PATH,new byte[0], ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.PERSISTENT);
} catch (IOException | InterruptedException | KeeperException e) {
e.printStackTrace();
SneakyThrows
Override
public void lock() {
if (exceptionList.size() 0){
throw new RuntimeException(exceptionList.get(0));
if (this.tryLock()){
log.info( 当前线程:{},和临界资源:{},获得了锁 ,Thread.currentThread().getName(),lockName);
return;
}else {
// 等待锁
waitForLock(WAIT_LOCK,LOCK_WAIT_TIME);
Override
public void lockInterruptibly() throws InterruptedException {
this.lock();
* 试图获取锁
* return 是否已经获得了锁
Override
public boolean tryLock() {
String splitStr _lock_ ;
if (lockName.contains(splitStr)){
throw new RuntimeException( 锁名有误 );
// 创建临时有序节点
try {
CURRENT_LOCK zooKeeper.create(LOCK_PREFIX lockName splitStr,new byte[0],ZooDefs.Ids.OPEN_ACL_UNSAFE,CreateMode.EPHEMERAL_SEQUENTIAL);
log.info( 当前锁:{}已经创建 ,CURRENT_LOCK);
// 取出父节点下所有子节点
List String childrenList zooKeeper.getChildren(ZK_LOCK_PATH, false);
// 取出所有lockName的锁
ArrayList String lockNames new ArrayList ();
for (String children : childrenList) {
String childrenLockName children.split(splitStr)[0];
if (childrenLockName.equals(lockName)){
lockNames.add(children);
// 排序
Collections.sort(lockNames);
log.info( 当前线程:{}获取的锁是:{} ,Thread.currentThread().getName(),CURRENT_LOCK);
// 若当前节点为最小节点 则获取锁成功
if (CURRENT_LOCK.equals(LOCK_PREFIX lockNames.get(0))){
return true;
// 若不是最小节点 则找到自己的前一个节点
String preChildren CURRENT_LOCK.substring(CURRENT_LOCK.lastIndexOf( / ) 1);
WAIT_LOCK lockNames.get(Collections.binarySearch(lockNames,preChildren) - 1);
} catch (KeeperException | InterruptedException e) {
e.printStackTrace();
return false;
* 试图获取锁
* return 是否已经获得了锁
SneakyThrows
Override
public boolean tryLock(long time, TimeUnit unit) throws InterruptedException {
if (this.tryLock()){
return true;
return waitForLock(WAIT_LOCK,LOCK_WAIT_TIME);
Override
public void unlock() {
log.info( 释放锁:{} ,CURRENT_LOCK);
try {
zooKeeper.delete(CURRENT_LOCK,-1);
CURRENT_LOCK null;
} catch (InterruptedException | KeeperException e) {
e.printStackTrace();
}finally {
try {
zooKeeper.close();
} catch (InterruptedException e) {
e.printStackTrace();