栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

Zookeeper学习笔记(二)应用之分布式锁

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Zookeeper学习笔记(二)应用之分布式锁

// 连接到 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();
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/268099.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号