package zk.lock;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import org.apache.zookeeper.CreateMode;
import org.apache.zookeeper.WatchedEvent;
import org.apache.zookeeper.Watcher;
import org.apache.zookeeper.Watcher.Event.EventType;
import org.apache.zookeeper.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;
public class ZkDistributedClient {
// 超时时间
private static final int SESSION_TIMEOUT = 5000;
// zookeeper server列表
private String hosts = "127.0.0.1:2181";
private String groupNode = "locks1";
//private String subNode = "sub";
private ZooKeeper zk;
// 当前client创建的子节点
private String thisPath;
// 当前client等待的子节点
private String waitPath;
private CountDownLatch latch = new CountDownLatch(1);
//返回结果
public String result =null;
/**
* 连接zookeeper
* subNode 临时节点头
* data 数据
*/
public String connectZookeeper(String subNode,String data) throws Exception {
final String fdata = data;
zk = new ZooKeeper(hosts, SESSION_TIMEOUT, new Watcher() {
public void process(WatchedEvent event) {
try {
// 连接建立时, 打开latch, 唤醒wait在该latch上的线程
if (event.getState() == KeeperState.SyncConnected) {
latch.countDown();
}
// 发生了waitPath的删除事件
if (event.getType() == EventType.NodeDeleted && event.getPath().equals(waitPath)) {
// 确认thisPath是否真的是列表中的最小节点
List<String> childrenNodes = zk.getChildren("/" + groupNode, false);
String thisNode = thisPath.substring(("/" + groupNode + "/").length());
// 排序
Collections.sort(childrenNodes);
int index = childrenNodes.indexOf(thisNode);
if (index == 0) {
// 确实是最小节点
String t = doSomething(fdata);
System.out.println("watch:::"+t);
result = t;
} else {
// 说明waitPath是由于出现异常而挂掉的
// 更新waitPath
waitPath = "/" + groupNode + "/" + childrenNodes.get(index - 1);
// 重新注册监听, 并判断此时waitPath是否已删除
if (zk.exists(waitPath, true) == null) {
String tt = doSomething(fdata);
System.out.println("watch===watch:::"+tt);
result = tt;
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
// 等待连接建立
latch.await();
// 创建子节点
thisPath = zk.create("/" + groupNode + "/" + subNode, null, Ids.OPEN_ACL_UNSAFE,
CreateMode.EPHEMERAL_SEQUENTIAL);
// wait一小会, 让结果更清晰一些
Thread.sleep(10);
// 注意, 没有必要监听"/locks"的子节点的变化情况
List<String> childrenNodes = zk.getChildren("/" + groupNode, false);
// 列表中只有一个子节点, 那肯定就是thisPath, 说明client获得锁
if (childrenNodes.size() == 1) {
return doSomething(data);
} else {
String thisNode = thisPath.substring(("/" + groupNode + "/").length());
System.out.println(thisNode +"--------------");
// 排序
Collections.sort(childrenNodes);
int index = childrenNodes.indexOf(thisNode);
if (index == -1) {
// never happened
} else if (index == 0) {
// inddx == 0, 说明thisNode在列表中最小, 当前client获得锁
return doSomething(data);
} else {
// 获得排名比thisPath前1位的节点
this.waitPath = "/" + groupNode + "/" + childrenNodes.get(index - 1);
// 在waitPath上注册监听器, 当waitPath被删除时, zookeeper会回调监听器的process方法
zk.getData(waitPath, true, new Stat());
return null;
}
}
return null;
}
private String doSomething(String data) throws Exception {
try {
System.out.println("gain lock: " + thisPath+"----"+data);
byte[] by= zk.getData("/locknum", null, null);
String num = new String(by);
System.out.println(num+" :::::当前值--------------------------");
Integer newNum = Integer.parseInt(num) -1;
zk.setData("/locknum", newNum.toString().getBytes(), -1);
System.out.println(newNum+" :::::最终值--------------------------");
Thread.sleep(2000);
// do something
} finally {
System.out.println("finished: " + thisPath);
// 将thisPath删除, 监听thisPath的client将获得通知
// 相当于释放锁
zk.delete(this.thisPath, -1);
}
return data;
}
public static void main(String[] args) throws Exception {
for (int i = 0; i < 5; i++) {
new Thread() {
public void run() {
try {
ZkDistributedClient dl = new ZkDistributedClient();
String s = dl.connectZookeeper("gao","test");
System.out.println("return-=========="+s);
System.out.println("return========================"+dl.result);
} catch (Exception e) {
e.printStackTrace();
}
}
}.start();
}
Thread.sleep(Long.MAX_VALUE);
}
}
相关推荐
这时,Zookeeper,一个高可用的分布式协调服务,常被用来实现分布式锁。 Zookeeper由Apache基金会开发,它提供了一种可靠的分布式一致性服务,包括命名服务、配置管理、集群同步、领导者选举等功能。Zookeeper基于...
这里,我们将深入探讨如何利用ZooKeeper这一强大的分布式协调服务来实现分布式锁,以解决订单编号的唯一性问题。 ZooKeeper是由Apache Hadoop项目孵化的开源项目,它提供了一个高可用、高性能的分布式协调服务。其...
分布式锁是解决多节点系统中同步问题的一种常见技术,ZooKeeper,由Apache基金会开发的分布式协调服务,常被用于实现高效可靠的分布式锁。本文将深入探讨如何利用ZooKeeper来构建分布式锁,并讨论其背后的关键概念和...
本部分将详细介绍使用Zookeeper实现分布式锁的知识点。 Zookeeper是Apache的一个开源项目,它为分布式应用提供了高可用性、顺序保证以及集群间同步等特性,它能够很好地帮助实现分布式锁。 **Zookeeper分布式锁的...
Zookeeper,一个由Apache开发的分布式协调服务,提供了实现分布式锁的有效机制。 Zookeeper分布式锁的工作原理: 1. **会话和临时节点**:Zookeeper支持两种类型的节点,持久节点和临时节点。临时节点在客户端会话...
除了ZooKeeper分布式锁外,还有其他分布式锁实现方案,如Redis分布式锁、MySQL分布式锁等。这些分布式锁实现方案都有其优缺点,需要根据不同的分布式系统需求进行选择。 ZooKeeper分布式锁是一种高效、灵活的分布式...
Redis和Zookeeper是两种常用的分布式协调服务,它们都可以用来实现分布式锁,但具体实现方式和特性有所不同。 **Redis分布式锁** Redis作为内存数据库,具有高性能、低延迟的特点,常被用作实现分布式锁。Redis...
接下来,我们转向使用Zookeeper实现的分布式锁。Zookeeper是一个分布式服务协调框架,它提供了一种可靠的分布式协调机制。Apache Curator是Zookeeper的一个客户端库,简化了与Zookeeper的交互。以下是使用Curator...
zooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是集群的管理者。提供了文件系统和通知机制。...在开发项目的过程中,很多大型项目都是分布式部署的,那么我们现在使用zookeeper实现一个分布式锁。
Zookeeper是由Apache软件基金会开发的开源项目,旨在提供一种高效、可靠的分布式协调机制,广泛应用于配置管理、命名服务、集群管理、分布式锁、事件发布/订阅等场景。 **一、Zookeeper基本概念** 1. **节点...
3. 基于Zookeeper的分布式锁:利用Zookeeper的临时有序节点和watcher特性,实现公平锁和非公平锁。这种实现方式稳定且可扩展,但需要对Zookeeper有一定的了解。 4. 基于分布式服务框架的分布式锁:如Dubbo、Spring ...
通过深入理解Zookeeper的工作原理以及ZookeeperNet库的使用,开发者可以有效地在C#环境中实现高可用的分布式锁,保障多节点之间的协同工作和数据一致性。在实际项目中,分布式锁可以广泛应用于数据库操作、并发任务...
Zookeeper提供了一种类似于文件系统的数据模型,可以用于命名服务、配置管理、集群管理、分布式锁等场景。它具有强一致性、高可用性和高性能的特点,是实现分布式锁的理想选择。 **Zookeeper的分布式锁实现原理** ...
**Redis与Zookeeper分布式锁对比** 1. **Redis分布式锁** - **优点:** - 实现简单,基于`SETNX`或`SET`命令加上超时机制可以快速构建分布式锁。 - 性能高,因为Redis是内存数据库,读写速度非常快。 - 支持...
Zookeeper 实现分布式锁 Zookeeper 是一个分布式协调服务,可以为分布式应用提供高效、可靠、可扩展的分布式锁服务。Zookeeper 实现分布式锁是指使用 Zookeeper 来管理分布式环境中的共享资源,实现互斥访问,以...
ZooKeeper是一个高度可靠的分布式协调服务,它提供了诸如分布式锁、队列和配置管理等核心功能。Curator则是Apache ZooKeeper的一个客户端库,它简化了ZooKeeper的使用,提供了丰富的工具和策略,使得开发人员能够更...
在这个场景下,我们将关注ZooKeeper如何实现分布式锁,特别是不可重入锁、可重入锁以及可重入读写锁的概念与实践。 首先,我们要理解什么是分布式锁。在多节点并发访问共享资源时,分布式锁能确保同一时刻只有一个...
本压缩包“zk:redis分布式锁.zip”提供了基于Zookeeper(zk)和Redis两种分布式锁实现的示例和相关资料。 首先,我们来看Zookeeper(zk)的分布式锁。Zookeeper是Apache的一个开源项目,提供了一个高可用的、高性能...
本项目基于SpringBoot框架,结合Redis、Zookeeper和RabbitMQ实现了分布式锁,让我们一起深入探讨这三个组件在分布式锁中的作用和实现机制。 **SpringBoot** 是一个轻量级的Java开发框架,它简化了新Spring应用的...