zoukankan      html  css  js  c++  java
  • 十一、curator recipes之联锁InterProcessMultiLock

    简介

    curator实现了一个类似容器的锁InterProcessMultiLock,它可以把多个锁包含起来像一个锁一样进行操作,简单来说就是对多个锁进行一组操作。当acquire的时候就获得多个锁资源,否则失败。当release时候释放所有锁资源,不过如果其中一把锁释放失败将会被忽略。

    官方文档:http://curator.apache.org/curator-recipes/multi-shared-lock.html

    javaDoc:http://curator.apache.org/apidocs/org/apache/curator/framework/recipes/locks/InterProcessMultiLock.html

    代码示例

    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.InterProcessMultiLock;
    import org.apache.curator.framework.recipes.locks.InterProcessMutex;
    import org.apache.curator.retry.ExponentialBackoffRetry;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class MultiLockDemo {
        private static CuratorFramework       client  = CuratorFrameworkFactory.newClient("localhost:2181", new ExponentialBackoffRetry(3000, 2));
        private static String                 path1   = "/mutex/001";
        private static String                 path2   = "/mutex/002";
        private static List<InterProcessLock> mutexes = new ArrayList<>();
        private static InterProcessMutex      mutex1;
        private static InterProcessMutex      mutex2;
    
        static {
            mutex1 = new InterProcessMutex(client, path1);
            mutex2 = new InterProcessMutex(client, path2);
            mutexes.add(mutex1);
            mutexes.add(mutex2);
            client.start();
        }
    
        public static void main(String[] args) throws Exception {
            InterProcessMultiLock multiLock = new InterProcessMultiLock(mutexes);
            multiLock.acquire();
            System.out.println("acquired multi lock");
            startThread0();
            startThread1();
            Thread.sleep(5000);
            multiLock.release();
            System.out.println("release multi lock");
            Thread.sleep(50000);
            client.close();
        }
    
        public static void startThread0() throws InterruptedException {
            Thread.sleep(1000);
            new Thread(() -> {
                try {
                    System.out.println("thread0 acquring");
                    mutex1.acquire();
                    System.out.println("thread0 acquired");
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    try {
                        mutex1.release();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    
        public static void startThread1() throws InterruptedException {
            Thread.sleep(1000);
            new Thread(() -> {
                try {
                    System.out.println("thread1 acquiring");
                    mutex2.acquire();
                    System.out.println("thread1 acquired");
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    try {
                        mutex2.release();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }).start();
        }
    }
  • 相关阅读:
    反转字符串(指定子串不反转)
    字符串相同字符个数统计
    指针函数/回调函数
    simplest_dll 最简dll的创建与隐式调用(显式调用太麻烦,个人不建议使用)
    字符串的相关操作
    sizeof()函数求各类型变量所占空间的方法
    对于数组使用sizeof(a)和使用sizeof(a[0])
    交换两个数的三种方法
    最简字符串查找操作(静态顺序串,非链串)
    类模板 template<class T>
  • 原文地址:https://www.cnblogs.com/lay2017/p/10274969.html
Copyright © 2011-2022 走看看