美文网首页Zookeeper
Zookeeper 跨进程共享锁

Zookeeper 跨进程共享锁

作者: 韭菜待收割 | 来源:发表于2018-10-19 14:25 被阅读12次

本地使用Zookeeper伪集群模式,同步锁控制多个进程的同步状态。

1、获取锁

实现方式:
1.各个进程创建一个EPHEMERAL_SEQUENTIAL目录节点。
2.调用getChildren方法获取当前的目录节点列表中最小的目录节点,
  如果是自己创建的,那么它就获得了这个锁;
  如果不是自己创建的调用exists();并监控 Zookeeper 上目录节点列表的变化,
  一直到自己创建的节点是列表中最小编号的目录节点就可以获得锁。

2、释放锁

实现方式:
1.获取到锁的Server删除自己所创建的目录节点。

3、代码示例

public class MainTest implements Runnable {

    private static ZooKeeper zooKeeper;
    private static String root = "/xmy";
    private static String tempZnode = "/lock";
    private static String myZnode = null;
    private static String hostPort = "127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183";

    public static void main(String[] args) throws Exception {
        zooKeeper = new ZooKeeper(hostPort, 5000, null);
        //创建一个EPHEMERAL_SEQUENTIAL目录节点
        myZnode = zooKeeper.create(root + tempZnode, "value".getBytes(), ZooDefs.Ids.OPEN_ACL_UNSAFE, CreateMode.PERSISTENT_SEQUENTIAL);
        System.out.println("----------创建的目录名为:" + myZnode);

        MainTest mainTest = new MainTest();
        mainTest.tryLock();
    }

    /**
     * 获取锁
     */
    public void tryLock() throws Exception {
        System.out.println("----------抢锁开始----------");

        List<String> list = zooKeeper.getChildren(root, false);
        String[] nodes = list.toArray(new String[list.size()]);
        Arrays.sort(nodes);
        if (myZnode.equals(root + "/" + nodes[0])) {
            System.out.println("----------我抢到了锁----------");
            Thread.sleep(60 * 1000);
            System.out.println("----------执行1分钟任务结束----------");
            doReleaseShared();
        } else {
            waitForLock(nodes[0]);
        }
    }

    void waitForLock(String lower) throws Exception {
        System.out.println("----------未获取到锁----------");
        //监听
        Watcher childrenWatcher = new Watcher() {
            @Override
            public void process(WatchedEvent event) {
                System.out.println("----------收到的消息: " + event.toString());
                if (event.getType() == Event.EventType.NodeDeleted) {
                    try {
                        synchronized (this) {
                            notifyAll();
                        }
                    } catch (Exception e) {
                        throw new RuntimeException(e);
                    }
                }
            }
        };

    /**
     * 释放锁
     */
    public void doReleaseShared() throws Exception {
        System.out.println("----------我释放了锁----------");
        zooKeeper.delete(myZnode, -1);
    }


    @Override
    public void run() {
        try {
            synchronized (this) {
                while (true) {
                    wait();
                }
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
            Thread.currentThread().interrupt();
        } finally {
            this.close();
        }
    }

    public synchronized void close() {
        try {
            zooKeeper.close();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

相关文章

  • Zookeeper 跨进程共享锁

    本地使用Zookeeper伪集群模式,同步锁控制多个进程的同步状态。 1、获取锁 2、释放锁 3、代码示例

  • 基于Zookeeper的分布式共享锁

    基于Zookeeper的分布式共享锁 实现原理 基于Zookeeper、Lock实现的分布共享式锁 构造初始化Zo...

  • zookeeper 分布式锁种类以及优缺点

    摘要:zookeeper分布式锁原理:1 大家也许都很熟悉了多个线程或者多个进程间的共享锁的实现方式了,但是在分布...

  • Zookeeper Watcher机制

    ZooKeeper是用来协调(同步)分布式进程的服务,多个分布式进程通过ZooKeeper提供的API来操作共享的...

  • 分布式锁

    一、分布式锁 分布式锁是指在跨进程、跨服务器、跨网络的情况下对共享资源的互斥访问,保证数据一致性。 二、zooke...

  • zookeeper实现分布式锁

    分布式锁主要用于在分布式环境中保证数据的一致性。包括跨进程、跨机器、跨网络导致共享资源不一致的问题。 分布式锁的实...

  • 使用zookeeper实现分布式锁

    应用场景 分布式锁主要用于在分布式环境中保护跨进程、跨主机、跨网络的共享资源实现互斥访问,以达到保证数据的一致性。...

  • AbstractQueuedSynchronizer

    理解多线程的并发锁,可结合多进程的分布式锁(如Zookeeper的互斥锁、读写锁的实现原理),本质是相通的 介绍 ...

  • Zookeeper典型使用场景

    1. Zookeeper 非公平锁/公平锁/共享锁 1.1 非公平锁 如下实现方式在并发问题比较严重的情况下,性...

  • 加锁原则

    1、多线程进程并行访问共享资源,一定要加锁保护 共享资源(全局变量,静态变量,共享内存,文件) 2、每个锁只锁一个...

网友评论

    本文标题:Zookeeper 跨进程共享锁

    本文链接:https://www.haomeiwen.com/subject/xmiyzftx.html