Zookeeper Curator 框架实现分布式锁

官方文档:https://curator.apache.org/index.html

 

依赖

<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.5.7</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.3.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-client</artifactId>
<version>4.3.0</version>
</dependency>

  

案例

package com.syf.case3;
 
import org.apache.curator.framework.CuratorFramework;
import org.apache.curator.framework.CuratorFrameworkFactory;
import org.apache.curator.framework.recipes.locks.InterProcessMutex;
import org.apache.curator.retry.ExponentialBackoffRetry;
 
public class CuratorLockTest {
    public static void main(String[] args) {
 
        // 创建分布式锁1
        InterProcessMutex lock1 = new InterProcessMutex(getCuratorFramework(), "/locks");
        // 创建分布式锁2
        InterProcessMutex lock2 = new InterProcessMutex(getCuratorFramework(), "/locks");
        new Thread(new Runnable() {
            @Override
            public void run() {
 
                try {
                    lock1.acquire();
                    System.out.println("线程1 获取到锁");
 
                    lock1.acquire();
                    System.out.println("线程1 再次获取到锁");
 
                    Thread.sleep(5 * 1000);
 
                    lock1.release();
                    System.out.println("线程1 释放锁");
                    Thread.sleep(5 * 1000);
                    lock1.release();
                    System.out.println("线程1 再次释放锁");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
 
        new Thread(new Runnable() {
            @Override
            public void run() {
 
                try {
                    lock2.acquire();
                    System.out.println("线程2 获取到锁");
 
                    lock2.acquire();
                    System.out.println("线程2 再次获取到锁");
 
                    Thread.sleep(5 * 1000);
 
                    lock2.release();
                    System.out.println("线程2 释放锁");
                    Thread.sleep(5 * 1000);
                    lock2.release();
                    System.out.println("线程2 再次释放锁");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
 
    private static CuratorFramework getCuratorFramework() {
 
        ExponentialBackoffRetry policy = new ExponentialBackoffRetry(3000, 3);
 
        CuratorFramework client = CuratorFrameworkFactory.builder().connectString("hadoop102:2181,hadoop103:2181,hadoop104:2181")
                .connectionTimeoutMs(2000)
                .sessionTimeoutMs(2000)
                .retryPolicy(policy).build();
        // 启动客户端
        client.start();
        System.out.println("zookeeper 启动成功");
        return client;
    }
}

  

 

posted @   非帆丶  阅读(93)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
点击右上角即可分享
微信分享提示