利用zookeeper 实现分布式锁

利用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连接

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏顶级程序员

40个多线程问题总结

源 / 架构师小秘圈 文 / 五月的仓颉 1、多线程有什么用? 一个可能在很多人看来很扯淡的一个问题:我会用多线程就好了,还管它有什么用?在我看来,这个回...

42870
来自专栏微信公众号:Java团长

40个Java多线程问题总结

这些多线程的问题,有些来源于各大网站、有些来源于自己的思考。可能有些问题网上有、可能有些问题对应的答案也有、也可能有些各位网友也都看过,但是本文写作的重心就是所...

15330
来自专栏编程

PHP7 下的协程实现

前言 相信大家都听说过『协程』这个概念吧。 但是有些同学对这个概念似懂非懂,不知道怎么实现,怎么用,用在哪,甚至有些人认为yield就是协程! 我始终相信,如果...

37180
来自专栏Java编程

40个Java多线程问题总结

个人认为,学习,内容越多、越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的。这篇文章主要是对多线程的问题进行总结的,因此罗列了40个多线程的...

2K50
来自专栏java一日一条

40个Java多线程问题总结

Java多线程分类中写了21篇多线程的文章,21篇文章的内容很多,个人认为,学习,内容越多、越杂的知识,越需要进行深刻的总结,这样才能记忆深刻,将知识变成自己的...

6820
来自专栏JAVA高级架构

JAVA后端面试100 Q&amp;A之第一篇

11410
来自专栏java技术学习之道

java线程-看这一篇就够了

15430
来自专栏微信公众号:Java团长

Java中的多线程你只要看这一篇就够了

如果对什么是线程、什么是进程仍存有疑惑,请先Google之,因为这两个概念不在本文的范围之内。

8210
来自专栏Java技术栈

史上最全 Java 多线程面试题及答案

这些多线程的问题,有些来源于各大网站、有些来源于自己的思考。可能有些问题网上有、可能有些问题对应的答案也有、也可能有些各位网友也都看过,但是本文写作的重心就是所...

8810
来自专栏IT技术精选文摘

Java多线程知识小抄集(三)

51. SimpleDateFormat非线程安全 当多个线程共享一个SimpleDateFormat实例的时候,就会出现难以预料的异常。 主要原因是parse...

22960

扫码关注云+社区

领取腾讯云代金券