`

Zookeeper分布式锁

 
阅读更多

以下简单介绍使用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的分布式锁实现demo

    **Zookeeper分布式锁的关键特性包括:** 1. **顺序一致性:** Zookeeper中的节点被创建顺序是全局唯一的,这有助于实现锁的唯一性。 2. **原子性:** 创建和删除节点的操作在Zookeeper中都是原子性的,这保证了...

    zookeeper分布式锁实现和客户端简单实现

    Zookeeper提供了一种类似于文件系统的数据模型,可以用于命名服务、配置管理、集群管理、分布式锁等场景。它具有强一致性、高可用性和高性能的特点,是实现分布式锁的理想选择。 **Zookeeper的分布式锁实现原理** ...

    使用ZooKeeper实现分布式锁

    在处理订单生成的场景中,我们可以这样应用ZooKeeper分布式锁: 1. 当用户发起订单请求时,服务端会尝试在ZooKeeper上创建一个临时顺序节点。 2. 如果创建成功,服务端会检查当前最小序号的节点是否是自己创建的。...

    zookeeper分布式锁

    Zookeeper分布式锁的工作原理: 1. **会话和临时节点**:Zookeeper支持两种类型的节点,持久节点和临时节点。临时节点在客户端会话失效(例如,客户端崩溃或网络断开)时会被自动删除,这为实现分布式锁提供了一个...

    zookeeper 分布式锁的实现1

    Zookeeper 是一个广泛使用的分布式协调服务,它可以用来实现高效的分布式锁,尤其适合那些对数据一致性要求较高的场景。 Zookeeper 的分布式锁实现依赖于其核心特性: 1. **节点的互斥性**:Zookeeper 允许客户端...

    Zookeeper分布式锁的4种异常状态分析.pdf

    #资源达人分享计划#

    4.1zookeeper 分布式锁简单练习

    4.1zookeeper 分布式锁简单练习

    zookeeper做分布式锁

    分布式锁是解决多节点系统中同步问题的一种常见技术,ZooKeeper,由Apache基金会开发的分布式协调服务,常被用于实现高效可靠的分布式锁。本文将深入探讨如何利用ZooKeeper来构建分布式锁,并讨论其背后的关键概念和...

    第15周 Zookeeper分布式锁与变种多级缓存

    第15周 Zookeeper分布式锁与变种多级缓存

    一文彻底理解ZooKeeper分布式锁的实现原理

    《彻底理解ZooKeeper分布式锁实现原理》 ZooKeeper,简称zk,作为一个高可用的分布式协调服务,常被用于构建分布式系统中的各种组件,如分布式锁。在本篇文章中,我们将深入探讨如何利用Curator这个流行的开源框架...

    zookeeper分布式锁实例源码

    在这个场景下,我们将关注ZooKeeper如何实现分布式锁,特别是不可重入锁、可重入锁以及可重入读写锁的概念与实践。 首先,我们要理解什么是分布式锁。在多节点并发访问共享资源时,分布式锁能确保同一时刻只有一个...

    秒杀系统企业级实战应用(真实工业界案例)87 秒杀系统高并发之zookeeper分布式锁

    秒杀系统企业级实战应用(真实工业界案例)87 秒杀系统高并发之zookeeper分布式锁

    基于zookeeper的分布式锁简单实现

    这时,Zookeeper,一个高可用的分布式协调服务,常被用来实现分布式锁。 Zookeeper由Apache基金会开发,它提供了一种可靠的分布式一致性服务,包括命名服务、配置管理、集群同步、领导者选举等功能。Zookeeper基于...

    C#基于zookeeper分布式锁的实现源码

    在C#开发环境中,我们可以借助外部协调服务,如Apache ZooKeeper,来实现分布式锁。ZooKeeper是一个高可用的分布式协调服务,它提供了诸如命名服务、配置管理、分布式同步、组服务等功能。本篇将深入探讨如何在C#中...

    springboot zookeeper 分布式锁

    SpringBoot结合Zookeeper可以构建高效可靠的分布式锁解决方案,有效地防止羊群效应,即多个客户端同时请求资源导致大量请求涌入,从而影响系统性能。下面我们将深入探讨这个主题。 首先,SpringBoot是一个快速开发...

    基于zookeeper实现分布式锁

    zooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是集群的管理者。提供了文件系统和通知机制。...在开发项目的过程中,很多大型项目都是分布式部署的,那么我们现在使用zookeeper实现一个分布式锁。

    zookeeper实现分布式锁

    在程序开发过程中不得不考虑的就是并发问题。在java中对于同一个jvm而言,jdk已经提供了lock和同步等。但是在分布式情况下,往往存在多个进程对一些资源产生竞争...分布式锁顾明思议就是可以满足分布式情况下的并发锁。

    从Paxos到Zookeeper分布式一致性原理与实践PDF

    《从Paxos到Zookeeper分布式一致性原理与实践》是一本深入探讨分布式系统一致性问题的著作,其中重点讲解了Paxos算法与Zookeeper在实际应用中的理论与实践。Paxos是分布式计算领域中著名的共识算法,为解决分布式...

    ZookeeperNet实现分布式锁

    通过深入理解Zookeeper的工作原理以及ZookeeperNet库的使用,开发者可以有效地在C#环境中实现高可用的分布式锁,保障多节点之间的协同工作和数据一致性。在实际项目中,分布式锁可以广泛应用于数据库操作、并发任务...

    Zookeeper实现分布式锁

    4. **zkLockTest**:这个文件很可能是实现Zookeeper分布式锁的测试代码,可能包含客户端的连接、锁的获取和释放、异常处理等逻辑。通过对这个测试代码的分析和运行,我们可以深入理解Zookeeper分布式锁的工作机制。 ...

Global site tag (gtag.js) - Google Analytics