闲暇时研究了下基于ZooKeeper实现的分布式事务锁,做下记录,便于回顾复习
public class DistributeLock implements Lock,Watcher { //锁的名称 private String lockName; private long TIMEOUT = 3000; //当前锁的节点 private String currentLockNode; //前一个锁的节点 private String prevLockNode; private ZooKeeper zk; private int SESSION_TIME_OUT = 2000; private String ROOT_LOCK = "/locks"; private String PATH_PREFIX = "_locks"; //计数器-也为锁的触发器 private CountDownLatch countDownLatch; public DistributeLock(String ip,String lockName) { this.lockName = lockName; try { zk = new ZooKeeper(ip, SESSION_TIME_OUT, this); } catch (IOException e) { e.printStackTrace(); } } @Override public void process(WatchedEvent event) { if(countDownLatch!=null) { countDownLatch.countDown(); } } @Override public void lock() { if(tryLock()) { return ; }else { waitForLock(TIMEOUT); } } public boolean waitForLock(long timeOut) { Stat stat; try { stat = zk.exists(prevLockNode, true); if(stat!=null) { countDownLatch = new CountDownLatch(1); //设置超时时间 (不清楚会不会出现异常情况) countDownLatch.await(TIMEOUT,TimeUnit.MILLISECONDS); countDownLatch = null; } return true; } catch (KeeperException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } return false; } @Override public void lockInterruptibly() throws InterruptedException { if(zk!=null) { zk.close(); } } @Override public Condition newCondition() { return null; } @Override public boolean tryLock() { try { Stat stat = zk.exists(ROOT_LOCK, false); //没有根节点 if(stat==null) { zk.create(ROOT_LOCK, new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL); } if(lockName.contains(PATH_PREFIX)) { System.out.println("锁名称错误"); return false; } String nodePath = zk.create(ROOT_LOCK+"/"+lockName+"/"+PATH_PREFIX, new byte[0], Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL); //获取根目录下的子节点 List<String> childList = zk.getChildren(ROOT_LOCK, false); List<String> lockPathList = new ArrayList<String>(); for(String childNode:childList) { String splitePath = childNode.split("/"+PATH_PREFIX)[0]; if(splitePath.equals(ROOT_LOCK+"/"+lockName)) { lockPathList.add(childNode); } } Collections.sort(lockPathList); //当前节点为最小节点 if(nodePath.equals(lockPathList.get(0))) { currentLockNode = nodePath; return true; } //前一个节点 prevLockNode = lockPathList.get(lockPathList.indexOf(lockPathList)-1); return false; } catch (KeeperException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } return false; } @Override public boolean tryLock(long timeOut, TimeUnit timeUnit) throws InterruptedException { if(tryLock()) { return true; } return waitForLock(timeOut); } @Override public void unlock() { try { if(zk!=null) { zk.delete(currentLockNode, -1); zk.close(); } } catch (InterruptedException e) { e.printStackTrace(); } catch (KeeperException e) { e.printStackTrace(); } } }
相关推荐
基于zookeeper的分布式锁简单实现,包含测试代码,实用工具类
在分布式高并发的情况下,多个访问之间拥有唯一的一个订单编号,多次提交的订单不会出现重复的,只能是唯一的,ZooKeeper就很好的解决了唯一性
Zookeeper实现分布式锁的Demo Zookeeper实现分布式锁的Demo
zooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是集群的管理者。提供了文件系统和通知机制。...在开发项目的过程中,很多大型项目都是分布式部署的,那么我们现在使用zookeeper实现一个分布式锁。
NULL 博文链接:https://zhouguofeng.iteye.com/blog/2320290
基于zookeeper的分布式锁实现demo,可以直接用在生产环境
zookeeper做分布式锁
zookeeper实现分布式session sample
Zookeeper伪分布式集群搭建描述伪分布式集群就是在一台机器部署多个zk应用,部署之前服务器需要有jdk环境 java -version可以显示相关java
在程序开发过程中不得不考虑的就是并发问题。在java中对于同一个jvm而言,jdk已经提供了lock和同步等。但是在分布式情况下,往往存在多个进程对一些资源产生竞争...分布式锁顾明思议就是可以满足分布式情况下的并发锁。
吊打面试官之基于zookeeper实现分布式锁源码
从Paxos到Zookeeper分布式一致性原理与实践 + ZooKeeper-分布式过程协同技术详解
基于Zookeeper实现分布式锁实践。Zookeeper是一个分布式的,开源的分布式应用程序协调服务,是Hadoop和hbase的重要组件。zookeeper的数据机构是一种节点树的数据结构,zNode是基本的单位,znode是一种和unix文件系统...
只要创建好一个分布式锁,就要不断轮循这个锁什么时候释放。 zk只会对已经创建分布式锁的系统进行创建监听,所以性能消耗很小 2、运行出现错误 redis创建锁的节点如果挂了,那就只能等待超时才能释放锁 zk因为是创建...
zookeeper的分布式全局锁纯代码解决方案,特点:易上手,可二次开发和封装。
ZooKeeper-分布式过程协同技术详解 和 从Paxos到Zookeeper 分布式一致性原理与实践 电子书。喜欢请支持种作者。购买纸质版
基于zookeeper的分布式并发锁实践_1
基于zookeeper的分布式并发锁实践_2
基于zookeeper的分布式并发锁实践_3
基于zookeeper的分布式并发锁实践_4