命令行使用
#使用bin/zkCli.sh 连接到zk集群
#查看节点
ls /
#创建节点
create /data-test 1212
#获取节点值
get /data-test
#修改节点值
set /data-test 1313
#删除节点
delete /data-test
编程实践之监听
思路
1,创建一个服务(提供时间查询:ServerSocket,while循环accept,返回时间),连接zookeeper,把该服务的端口 注册到zookeeper
2,连接zookeeper,监听服务列表,每5秒给服务列表中的服务端口(ip为127.0.0.1),发送查询请求(Socket
编程实践之分布式锁
1. 什么是锁
- 在单机程序中,当存在多个线程可以同时改变某个变量(可变共享变量)时,一个时间点只能有一个线程能改变该值。
- 即对变量或者堆代码码块做同步,本质上就是加锁。目的就是实现多个线程在一个时刻同一个代码块只能有一个线程可执行
2,分布式锁
系统运行在两个不同的 JVM 里面,不同的机器上,增加的锁只对自己当前 JVM 里面的线程有效,对于其他 JVM 的线程是无效的。
所以在分布式中已经不是线程安全问题。是需要保证两台机器加的锁 是同一个锁,此时分布式锁就能解决资源同时间下争夺修改不一致问题。
3,分布式锁的作用
在整个系统提供一个全局、唯一的锁,在分布式系统中每个系统在进行相关操作的时 候需要获取到该锁,才能执行相应操作
4,zk实现分布式锁
思路
创建10个线程(创建一个线程实现类)
实现类run方法中
1,抢锁
(1)构造函数进行zookeeper连接和创建持久化节点
(2)抢锁逻辑编写
- 递归抢锁(if中尝试获取锁,else中等待锁,然后重新调用抢锁逻辑)
- 尝试获取锁逻辑:创建节点,暴露当前节点,获取路径下的所有节点的最小节点(进行排序),if相等,return true ;else 进行获取前一节点,暴露前一节点,return false;
- else中等待锁逻辑:监控前一个节点
- 创建监听:在删除事件中countDownLatch.countDown();//把值减1变为0,唤醒之前await线程
- 在监听的通知没来之前,该线程应该是等待状态,先判断一次上一个节点是否还存在
- 存在:
- countDownLatch = new CountDownLatch(1);//开始等待,CountDownLatch:线程同步计数器
- countDownLatch.await();//阻塞
// 解除监听zkClient . unsubscribeDataChanges ( beforNodePath , iZkDataListener );2,执行逻辑(线程睡2秒)
3,释放锁
if ( zkClient != null ) {zkClient . delete ( currentNoePath );zkClient . close ();}
注:以上为本人小小总结,如果对您起到了一点点帮助,请给予我一点鼓励,在下方点个小小的赞,谢谢,如有错误之处,望不吝指出,非常感谢!