以下简单介绍使用Curator来实现zk分布式锁的应用和原理。
1.连接zk的Factory类
package com.zk; import org.apache.curator.framework.CuratorFramework; import org.apache.curator.framework.CuratorFrameworkFactory; import org.apache.curator.retry.ExponentialBackoffRetry; public class ZkClientFactory { private static CuratorFramework client; //构造全局的zk链接对象 public static CuratorFramework getInstance(String url){ if(null == client){ synchronized(ZkClientFactory.class){ if(null == client){ CuratorFrameworkFactory.Builder builder = CuratorFrameworkFactory.builder(); client = builder.connectString(url) .sessionTimeoutMs(3000) .connectionTimeoutMs(3000) .canBeReadOnly(false) .retryPolicy(new ExponentialBackoffRetry(1000, Integer.MAX_VALUE)) .namespace(null) .defaultData(null) .build(); client.start(); } } } return client; } }
2.模拟多个线程来竞争锁
class MyJob extends Thread{ CuratorFramework client; public MyJob(CuratorFramework client){ this.client = client; } public void run(){ InterProcessMutex lock = new InterProcessMutex(client, "/test"); try { //lock.acquire();//会一直阻塞到获得锁成功 boolean locked= lock.acquire(2000, TimeUnit.MILLISECONDS);//获得锁成功或阻塞一定时间返回 if(locked){ System.out.println(this.getName()+"获取锁成功"); Thread.sleep(3000); }else{ System.out.println(this.getName()+"获取锁失败"); } } catch (Exception e) { }finally{ try { lock.release(); System.out.println(this.getName()+"释放锁成功"); } catch (Exception e) { } } } }
3.测试
public class Lock { private static final String ZK_ADDRESS = "127.0.0.1:2182"; private static CuratorFramework client = ZkClientFactory.getInstance(ZK_ADDRESS); public static void main(String[] args){ MyJob jb1 = new MyJob(client); MyJob jb2 = new MyJob(client); MyJob jb3 = new MyJob(client); jb1.start(); jb2.start(); jb3.start(); } }
4.打印结果 :
Thread-2获取锁成功
Thread-1获取锁失败
Thread-3获取锁失败
Thread-2释放锁成功
5.假如把加锁的代码换掉:
把
boolean locked= lock.acquire(2000, TimeUnit.MILLISECONDS);//获得锁成功或阻塞一定时间返回 if(locked){ System.out.println(this.getName()+"获取锁成功"); Thread.sleep(3000); }else{ System.out.println(this.getName()+"获取锁失败"); }
换为:
lock.acquire();//会一直阻塞到获得锁成功 System.out.println(this.getName()+"获取锁成功"); Thread.sleep(3000);
打印结果如下 :
Thread-3获取锁成功
Thread-3释放锁成功
Thread-2获取锁成功
Thread-2释放锁成功
Thread-1获取锁成功
Thread-1释放锁成功
可以看到,3个线程都可以顺序的获得到锁。所以具体使用哪个方法,需要看你的使用场景。
相关推荐
**Zookeeper分布式锁的关键特性包括:** 1. **顺序一致性:** Zookeeper中的节点被创建顺序是全局唯一的,这有助于实现锁的唯一性。 2. **原子性:** 创建和删除节点的操作在Zookeeper中都是原子性的,这保证了...
Zookeeper提供了一种类似于文件系统的数据模型,可以用于命名服务、配置管理、集群管理、分布式锁等场景。它具有强一致性、高可用性和高性能的特点,是实现分布式锁的理想选择。 **Zookeeper的分布式锁实现原理** ...
在处理订单生成的场景中,我们可以这样应用ZooKeeper分布式锁: 1. 当用户发起订单请求时,服务端会尝试在ZooKeeper上创建一个临时顺序节点。 2. 如果创建成功,服务端会检查当前最小序号的节点是否是自己创建的。...
Zookeeper分布式锁的工作原理: 1. **会话和临时节点**:Zookeeper支持两种类型的节点,持久节点和临时节点。临时节点在客户端会话失效(例如,客户端崩溃或网络断开)时会被自动删除,这为实现分布式锁提供了一个...
Zookeeper 是一个广泛使用的分布式协调服务,它可以用来实现高效的分布式锁,尤其适合那些对数据一致性要求较高的场景。 Zookeeper 的分布式锁实现依赖于其核心特性: 1. **节点的互斥性**:Zookeeper 允许客户端...
#资源达人分享计划#
4.1zookeeper 分布式锁简单练习
分布式锁是解决多节点系统中同步问题的一种常见技术,ZooKeeper,由Apache基金会开发的分布式协调服务,常被用于实现高效可靠的分布式锁。本文将深入探讨如何利用ZooKeeper来构建分布式锁,并讨论其背后的关键概念和...
第15周 Zookeeper分布式锁与变种多级缓存
《彻底理解ZooKeeper分布式锁实现原理》 ZooKeeper,简称zk,作为一个高可用的分布式协调服务,常被用于构建分布式系统中的各种组件,如分布式锁。在本篇文章中,我们将深入探讨如何利用Curator这个流行的开源框架...
在这个场景下,我们将关注ZooKeeper如何实现分布式锁,特别是不可重入锁、可重入锁以及可重入读写锁的概念与实践。 首先,我们要理解什么是分布式锁。在多节点并发访问共享资源时,分布式锁能确保同一时刻只有一个...
秒杀系统企业级实战应用(真实工业界案例)87 秒杀系统高并发之zookeeper分布式锁
这时,Zookeeper,一个高可用的分布式协调服务,常被用来实现分布式锁。 Zookeeper由Apache基金会开发,它提供了一种可靠的分布式一致性服务,包括命名服务、配置管理、集群同步、领导者选举等功能。Zookeeper基于...
在C#开发环境中,我们可以借助外部协调服务,如Apache ZooKeeper,来实现分布式锁。ZooKeeper是一个高可用的分布式协调服务,它提供了诸如命名服务、配置管理、分布式同步、组服务等功能。本篇将深入探讨如何在C#中...
SpringBoot结合Zookeeper可以构建高效可靠的分布式锁解决方案,有效地防止羊群效应,即多个客户端同时请求资源导致大量请求涌入,从而影响系统性能。下面我们将深入探讨这个主题。 首先,SpringBoot是一个快速开发...
zooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是集群的管理者。提供了文件系统和通知机制。...在开发项目的过程中,很多大型项目都是分布式部署的,那么我们现在使用zookeeper实现一个分布式锁。
在程序开发过程中不得不考虑的就是并发问题。在java中对于同一个jvm而言,jdk已经提供了lock和同步等。但是在分布式情况下,往往存在多个进程对一些资源产生竞争...分布式锁顾明思议就是可以满足分布式情况下的并发锁。
《从Paxos到Zookeeper分布式一致性原理与实践》是一本深入探讨分布式系统一致性问题的著作,其中重点讲解了Paxos算法与Zookeeper在实际应用中的理论与实践。Paxos是分布式计算领域中著名的共识算法,为解决分布式...
通过深入理解Zookeeper的工作原理以及ZookeeperNet库的使用,开发者可以有效地在C#环境中实现高可用的分布式锁,保障多节点之间的协同工作和数据一致性。在实际项目中,分布式锁可以广泛应用于数据库操作、并发任务...
4. **zkLockTest**:这个文件很可能是实现Zookeeper分布式锁的测试代码,可能包含客户端的连接、锁的获取和释放、异常处理等逻辑。通过对这个测试代码的分析和运行,我们可以深入理解Zookeeper分布式锁的工作机制。 ...