文档章节

利用zookeeper 实现分布式锁

w
 wannshan
发布于 2017/02/23 15:25
字数 379
阅读 66
收藏 1

利用Curator(流行的 zk 客户端工具包) 的 InterProcessMute 类


import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.locks.InterProcessLock;
import org.apache.curator.framework.recipes.locks.InterProcessMutex;
import org.apache.curator.retry.ExponentialBackoffRetry;

import java.util.Random;
import java.util.concurrent.CountDownLatch;

/**
 * 文件功能:zookeeper分布式锁
 * 故事:5个线程(模拟分布式进程)争夺分布式锁
 */
public class CuratorLocksExample {

    private static  InterProcessLock distributeLock=null;
    private static CountDownLatch count=new CountDownLatch(5);

    public static void main(String[] args) {
        CuratorFramework client = CuratorFrameworkFactory.newClient("192.168.64.128:2181", new ExponentialBackoffRetry(1000, 3));
        client.start();
        distributeLock=new InterProcessMutex(client,"/mylock");
        for(int i=0;i<5;i++){
            new Thread(new MyHostThread("线程"+i,client,distributeLock,count)).start();
        }

        try {
            count.await();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            System.out.println("释放客户端,断开zk连接");
            client.close();
        }

    }
}


class MyHostThread implements Runnable{

    private String name;
    private CuratorFramework client;
    private InterProcessLock lock;
    private  CountDownLatch count;
    public MyHostThread(String name,CuratorFramework client,InterProcessLock lock,CountDownLatch count){
        this.name=name;
        this.client=client;
        this.lock=lock;
        this.count=count;
    }

    @Override
    public void run() {
        System.out.println(this.name + "开始竞争锁");
        try {
            lock.acquire();//阻塞等待..
            System.out.println(this.name + "获取到锁");
            Thread.sleep(new Random().nextInt(2000));//模拟业务处理2s内
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                System.out.println(this.name + "业务处理完,释放锁");
                lock.release();//释放锁
                count.countDown();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

预期输出:

线程3开始竞争锁
线程0开始竞争锁
线程4开始竞争锁
线程1开始竞争锁
线程2开始竞争锁
线程0获取到锁
线程0业务处理完,释放锁
线程4获取到锁
线程4业务处理完,释放锁
线程1获取到锁
线程1业务处理完,释放锁
线程3获取到锁
线程3业务处理完,释放锁
线程2获取到锁
线程2业务处理完,释放锁
释放客户端,断开zk连接

© 著作权归作者所有

共有 人打赏支持
w
粉丝 20
博文 42
码字总数 79122
作品 0
浦东
技术主管
私信 提问
分布式锁与实现(二)基于ZooKeeper实现

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

rechardchensir
2018/10/08
0
0
ZooKeeper学习第五期--ZooKeeper管理分布式环境中的数据

引言 本节本来是要介绍ZooKeeper的实现原理,但是ZooKeeper的原理比较复杂,它涉及到了paxos算法、Zab协议、通信协议等相关知 识,理解起来比较抽象所以还需要借助一些应用场景,来帮我们理解...

卯金刀GG
2017/10/25
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

分布式环境中大多数服务是允许部分失败,也允许数据不一致,但有些最基础的服务是需要高可靠性,高一致性的,这些服务是其他分布式服务运转的基础,比如naming service、分布式lock等,这些分...

山哥
2012/03/19
0
0
分布式利器Zookeeper(三)

前言 《分布式利器Zookeeper(一)》 《分布式利器Zookeeper(二):分布式锁》 本篇博客是分布式利器Zookeeper系列的最后一篇,涉及的话题是:Zookeeper分布式锁的代码实现、zkclient的使用、...

zfz_linux_boy
2018/07/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

KaliLinuxNetHunter教程下载相关资源

KaliLinuxNetHunter教程下载相关资源 当用户将刷机工具准备完后,则需要下载ROM包。ROM是ROM image(只读内存镜像)的简称,常用于手机定制系统。一般手机刷机的过程,就是将只读内存镜像(R...

大学霸
30分钟前
1
0
C# 字符串插值

字符串插值 据说是 C# 6.0 中引入的新特性. 字符串插值允许您以更简洁易读的方式将字符串拼凑在一起. 如果在字符串的左引号前添加$,则可以在字符串中的大括号里包含字符串值,如变量等. 一些示...

taadis
54分钟前
2
0
Navicat使用教程:接收MySQL/MariaDB问题通知

下载Navicat Monitor最新版本 Navicat Monitor 是一套安全、简单而且无代理的远程服务器监控工具。它具有强大的功能使你的监控发挥最大效用。受监控的服务器包括 MySQL、MariaDB 和 Percona ...

电池盒
55分钟前
3
0
我是怎样和Linux系统结缘并通过红帽RHCE认证的

我高考完当时就是选择的计算机科学与技术专业,上大学以后联想到的和计算机相关的就只有写代码,开发,网站,网页设计,就没有其他的了,当时学习写代码也都是在Windows上,什么C#、C++之类的...

Linux就该这么学
今天
5
0
hbase的web页面访问

hbase1.1版本web页面默认不开放 在hbase-site.xml中加入一下内容即可 <!-- 新增的配置 --><property><name>hbase.master.info.port</name><value>60010</value></property> 借鉴htt......

你为什么不吃药
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部