手写Zookeeper分布式锁

zookeeper版本:zookeeper-3.4.13,该版本原生api不支持递归创建节点

依赖
<dependency>
    <groupId>org.apache.zookeeper</groupId>
    <artifactId>zookeeper</artifactId>
    <version>3.4.13</version>
</dependency>
Zookeeper分布式锁编写
import org.apache.zookeeper.*;

import java.io.IOException;
import java.util.concurrent.CountDownLatch;

/**
 * zk实现分布式锁
 */
public class ZkLock {


    // zk实例
    private ZooKeeper zooKeeper;

    // 计数器,启动一个线程
    private static final CountDownLatch downLatch = new CountDownLatch(1);


    /**
     * 加锁操作
     *
     * @param id
     */
    public void lock(Integer id) {
        // 节点路径
        String path = "/fluyi-product-lock-" + id;
        // 创建节点,一定要是临时节点,防止宕机无法释放节点
        try {
            zooKeeper.create(path, "".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
        } catch (Exception e) {
            // 加锁失败,再次尝试
            while (true) {
                // 休眠5秒
                try {
                    Thread.sleep(5000);
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
                // 进行重连
                try {
                    zooKeeper.create(path, "".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL);
                } catch (Exception ex) {
                    continue;
                }
                break;
            }
        }
    }

    /**
     * 解锁操作
     *
     * @param id
     */
    public void unlock(Integer id) {
        String path = "/fluyi-product-lock-" + id;
        // 任何版本
        try {
            zooKeeper.delete(path, -1);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }


    // 获取实例
    public static ZkLock getInstance() {
        return Sington.getInstance();
    }


    // 初始化
    private ZkLock() {
        try {
            zooKeeper = new ZooKeeper("xxx.xxx.xxx.xxx:2181", 50000, new zkWatch());
            try {
                downLatch.await();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("建立连接=》" + zooKeeper.getState());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private static class zkWatch implements Watcher {
        @Override
        public void process(WatchedEvent watchedEvent) {
            System.out.println("接受监听事件" + watchedEvent);
            // 进行连接
            if (watchedEvent.getState() == Event.KeeperState.SyncConnected) {
                // 连接成功
                downLatch.countDown();
            }
        }
    }


    // 单例
    private static class Sington {

        private static ZkLock zkLock;

        static {
            zkLock = new ZkLock();
        }

        private static ZkLock getInstance() {
            return zkLock;
        }
    }
}
测试使用
public class UnSafeThread {


    private static int num = 0;

    private static ZkLock zkLock = ZkLock.getInstance();

    /**
     * 创建10个线程
     */
    private static CountDownLatch countDownLatch = new CountDownLatch(10);


    public static void incr() {
        zkLock.lock(1);
        num++;
        System.out.println(num);
        zkLock.unlock(1);
    }


    public static void main(String[] args) {

        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                for (int j = 0; j < 100; j++) {
                    incr();
                    // 短暂休眠
                    try {
                        Thread.sleep(10);
                    } catch (InterruptedException e) {
                        throw new RuntimeException(e);
                    }
                    countDownLatch.countDown();
                }
            }
            ).start();
        }

        while (true) {
            if (countDownLatch.getCount() == 0) {
                System.out.println(num);
                break;
            }
        }
    }
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当面试中涉及到ZooKeeper分布式锁的问题,通常会涉及以下几个方面: 1. 什么是ZooKeeper分布式锁ZooKeeper分布式锁是基于ZooKeeper提供的原语实现的一种分布式锁机制。它利用了ZooKeeper的有序临时节点和Watcher机制来实现锁的竞争和释放。 2. ZooKeeper分布式锁的实现原理是什么? ZooKeeper分布式锁的实现原理主要依赖于ZooKeeper的有序临时节点和Watcher机制。当一个线程需要获取锁时,它会在ZooKeeper的指定路径上创建一个有序临时节点,并且注册一个Watcher来监听前一个节点是否存在。如果前一个节点不存在,则该线程获取锁成功;否则,该线程需要等待前一个节点被删除后继续竞争锁。 3. ZooKeeper分布式锁存在的问题有哪些? ZooKeeper分布式锁虽然实现了基本的锁机制,但仍然存在以下问题: - 网络延迟:由于网络延迟等原因,可能导致锁的竞争时间增加,影响系统的性能。 - 节点故障:如果持有锁的节点发生故障,可能导致其他节点无法获取锁或长时间等待。 - 死锁:如果在获取锁的过程中发生故障或异常,可能导致死锁情况的发生。 4. 如何解决ZooKeeper分布式锁的问题? 为了解决ZooKeeper分布式锁存在的问题,可以采取以下策略: - 设置合理的超时时间,避免长时间等待导致系统性能下降。 - 使用心跳机制来检测节点的存活状态,及时处理节点故障。 - 采用分布式协调框架或工具,如Curator、Spring Integration等,简化分布式锁的使用和管理。 这些是一些常见的ZooKeeper分布式锁面试题及其答案,希望能对你有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值