Zookeeper3.5.7版本—— Curator框架实现分布式锁案例

一、Zookeeper原生的 Java API 存在的问题

  • 会话连接是异步的,需要自己去处理。比如使用 CountDownLatch。
  • Watch 需要重复注册,不然就不能生效。
  • 开发的复杂性还是比较高的。
  • 不支持多节点删除和创建,需要自己去递归。

二、Zookeeper原生的 Java API 存在问题的解决方式

  • Curator 是一个专门解决分布式锁的框架,解决了原生Java API开发分布式遇到的问题。

三、Curator框架实现分布式锁示例代码

3.1、pom文件添加依赖

  • pom文件依赖

    <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>
    

3.2、示例代码

  • 代码

    package com.xz.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 释放锁");
                        // 再次释放锁对象
                        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 释放锁");
    
                        lock2.release();
                        System.out.println("线程2  再次释放锁");
    
                    } catch (Exception e) {
          
          
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    
        /**
         * 分布式锁初始化
         */
        private static CuratorFramework getCuratorFramework() {
          
          
            //重试策略,初试时间 3 秒,重试 3 次
            ExponentialBackoffRetry policy = new ExponentialBackoffRetry(3000, 3);
            // 通过工厂创建 Curator
            CuratorFramework client = CuratorFrameworkFactory.builder().connectString("192.168.136.26:2181")
                    .connectionTimeoutMs(200000)
                    .sessionTimeoutMs(20000)
                    .retryPolicy(policy).build();
    
            // 启动客户端
            client.start();
    
            System.out.println("zookeeper初始化完成");
            return client;
        }
    }
    

3.3、Curator框架实现分布式锁测试

  • 启动CuratorLockTest,查看idea控制台变化
    在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/li1325169021/article/details/129771590