文档章节

zookeeper分布式锁

熊猫你好
 熊猫你好
发布于 11/22 18:04
字数 422
阅读 7
收藏 0
//lock 锁 定义分布式锁
public interface Lock {
//获取锁
public void getLock();
//释放锁
public void unLock();
}
public abstract class ZookeeperAbstractLock implements Lock{

	//zk连接地址
	private static final String address = "127.0.0.1:2181";
	
	protected static final String path = "/lock";
	//zk连接客户端
	protected ZkClient zkClient = new ZkClient(address);
	
	protected CountDownLatch countDownLatch = null;
	
	public void getLock() {
		if(tryLock()){
			System.out.println("###获取锁成功###");
		}else{
			//等待
			waitLock();
			//重新获取锁
			getLock();
		}
		
	}

	public void unLock() {
		if(zkClient != null){
			zkClient.close();
		}
	}
	
	// 是否获取锁成功,成功返回true,失败返回false
	abstract Boolean tryLock();
	
	// 等待锁
	abstract void waitLock();
}
public class ZookeeperDistrbuteLock extends ZookeeperAbstractLock{

	@Override
	Boolean tryLock() {
		try{
			zkClient.createEphemeral(path);
			return Boolean.TRUE;
		}catch(Exception e){
			return Boolean.FALSE;
		}
	}

	@Override
	void waitLock() {
		//使用事件监听,获取到节点被删除
		IZkDataListener iZkDataListener = new IZkDataListener() {
			//当节点被删除的时候
			public void handleDataDeleted(String dataPath) throws Exception {
				if(countDownLatch != null){
					//信号量减一,唤醒
					countDownLatch.countDown();
				}
			}
			//当节点发生改变
			public void handleDataChange(String dataPath, Object data) throws Exception {
				// TODO Auto-generated method stub
				
			}
		};
		//注册节点信息
		zkClient.subscribeDataChanges(path, iZkDataListener);
		//检测节点是否存在,如果存在则等待
		if(zkClient.exists(path)){
			//创建信号量
			countDownLatch = new CountDownLatch(1);
			
			try{
				//进行等待
				countDownLatch.await();
			}catch(Exception e){
				
			}
		}
		//删除事件通知
		zkClient.unsubscribeDataChanges(path, iZkDataListener);
	}

}

<dependency>
            <groupId>com.101tec</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.10</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>2.7.0</version>
        </dependency>

public class CuratorDistrLockTest {

    /** Zookeeper info */
    private static final String ZK_ADDRESS = "127.0.0.1:2181";
    private static final String ZK_LOCK_PATH = "/zktest";

    public static void main(String[] args) throws InterruptedException {
        // 1.Connect to zk
        CuratorFramework client = CuratorFrameworkFactory.newClient(
                ZK_ADDRESS,
                new RetryNTimes(10, 5000)
        );
        client.start();
        System.out.println("zk client start successfully!");

        Thread t1 = new Thread(() -> {
            doWithLock(client);
        }, "t1");
        Thread t2 = new Thread(() -> {
            doWithLock(client);
        }, "t2");

        t1.start();
        t2.start();
    }

    private static void doWithLock(CuratorFramework client) {
        InterProcessMutex lock = new InterProcessMutex(client, ZK_LOCK_PATH);
        try {
            if (lock.acquire(10 * 1000, TimeUnit.SECONDS)) {
                System.out.println(Thread.currentThread().getName() + " hold lock");
                Thread.sleep(5000L);
                System.out.println(Thread.currentThread().getName() + " release lock");
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                lock.release();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

    }

}

© 著作权归作者所有

共有 人打赏支持
下一篇: nignx
熊猫你好
粉丝 5
博文 69
码字总数 20444
作品 0
遂宁
私信 提问
分布式锁与实现(二)基于ZooKeeper实现

引言 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包...

rechardchensir
10/08
0
0
大数据教程(3.3):zookeeper简介

一、概念 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功...

em_aaron
07/28
0
0
ZooKeeper可以用来做什么(转)

在ZooKeeper的官网上有这么一句话:ZooKeeper is a centralized service for maintaining configuration information, naming, providing distributed synchronization, and providing grou......

easonjim
2017/09/05
0
0
分布式锁与实现(二)——基于ZooKeeper实现

ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配...

刘祖鹏
05/08
0
0
Zookeeper 概述及应用场景

一、概述 分布式协调技术,主要用来解决分布式环境当中多个进程之间的同步控制,让他们有序的去访问某种临界资源,防止造成"脏数据"的后果。 ZooKeeper是一个分布式的,开放源码的分布式应用...

PeakFang-BOK
10/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

《Maven官方文档》-Maven依赖机制简介

《Maven官方文档》-Maven依赖机制简介 原文地址 译者:Tyrian 依赖机制是Maven最为用户熟知的特性之一,同时也是Maven所擅长的领域之一。单个项目的依赖管理并不难, 但是当你面对包含数百个...

tantexian
22分钟前
2
0
基于 Docker 快速部署多需求 Spark 自动化测试环境

引言 在进行数据分析时,Spark 越来越广泛的被使用。在测试需求越来越多、测试用例数量越来越大的情况下,能够根据需求快速自动化部署 Spark 环境、快速完成所有测试越来越重要。 本文基于 ...

呐呐丶嘿
39分钟前
3
0
支付宝APP支付之查看支付宝商户ID

1、登录支付宝蚂蚁金服开放平台 2、查看账号详情,选择合作伙伴管理,账户管理,查看角色身份,此处的PID就是商户ID 3、点击秘钥管理,可查看绑定的相关应用及其APPID等信息

Code辉
42分钟前
2
0
崛起于Springboot2.X之通讯WebSocket(40)

技术简介:Springboot2.0.3+freemaker+websocket 1、添加pom依赖 <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-bo......

木九天
51分钟前
1
0
Java常用四大线程池用法以及ThreadPoolExecutor详解

为什么用线程池? 1.创建/销毁线程伴随着系统开销,过于频繁的创建/销毁线程,会很大程度上影响处-理效率 2.线程并发数量过多,抢占系统资源从而导致阻塞 3.对线程进行一些简单的管理 在Java中...

孟飞阳
53分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部