文档章节

利用zookeeper 实现分布式锁

w
 wannshan
发布于 2017/02/23 15:25
字数 379
阅读 37
收藏 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
粉丝 18
博文 42
码字总数 79122
作品 0
浦东
技术主管
分布式设计与开发(三)------高一致性服务ZooKeeper

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

山哥
2012/03/19
0
0
分布式锁与实现(二)——基于ZooKeeper实现

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

刘祖鹏
05/08
0
0
分布式利器Zookeeper(三)

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

zfz_linux_boy
07/01
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

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Java IO类库之PrintStreamWriter

* A <code>PrintStream</code> adds functionality to another output stream, * namely the ability to print representations of various data values * conveniently. Two other fea......

老韭菜
今天
0
0
qduoj~前端~二次开发~笔记

青岛大学qdu的onlinejudge是js的写的前端,框架是vue.js,在nodejs上部署运行,其实整体运行还是建立在docker的容器虚拟环境里,这里暂时不需要docker。安装环境是Ubuntu14-64bit 1.安装一大...

虚拟世界的懒猫
今天
6
0
ConcurrentHashMap源码解读

部分内容转自:http://jiabinyuan.xyz/#/app/archive/detail/25 内部结构 内部采用了segment结构,每一个segment相当于一个hashtable。看下面的结构图: 从图的结构我们可以了解到,Concurr...

edwardGe
今天
1
0
Ubuntu终端Tab键自动补全

打开 /etc/bash.bashrc,找到下列代码,取消注释。 #enable bash completion in interactive shells#if ! shopt -oq posix; then# if [-f /usr/share/bash-completion/bash_compl......

大熊猫
今天
0
0
polipo socks5代理转http代理

天朝的网络,哎~ 装个 yarn 都时而会卡 假设在SSlocal 已经装好运行的前提下,来安装设置 polipo sudo apt-get install polipo sudo vim /etc/polipo/config 追加下列配置内容,并保存 socksP...

纯洁徐
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部