Zookeeper分佈式入門——ZK分佈式鎖的簡單實現

Zookeeper分佈式入門——ZK分佈式鎖的簡單實現
使用InterProcessMutex實現java

InterProcessMutex基於Zookeeper實現了分佈式的公平可重入互斥鎖,相似於單個JVM進程內的ReentrantLockapache

1.初始化InterProcessMutex

private static InterProcessMutex mutex = new InterProcessMutex(client, "/curator/lock");分佈式

2.獲取鎖

//得到了鎖
    public static boolean acquire(long time, TimeUnit unit){
        try {
            return mutex.acquire(time,unit);
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

3.釋放鎖

//釋放鎖
    public static void release(){
        try {
            mutex.release();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

測試:

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

import org.apache.curator.RetryPolicy;
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;
/**
 * 基於curator的zookeeper分佈式鎖
 * 這裏咱們開啓5個線程,每一個線程獲取鎖的最大等待時間爲5秒,爲了模擬具體業務場景,方法中設置4秒等待時間。
 * 
 */
public class CuratorUtil {
    private static String address = "192.168.12.101:2181";
    
    public static void main(String[] args) {
        //一、重試策略:初試時間爲1s 重試3次
        RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3); 
        //二、經過工廠建立鏈接
        CuratorFramework client = CuratorFrameworkFactory.newClient(address, retryPolicy);
        //三、開啓鏈接
        client.start();
        //4 分佈式鎖
        final InterProcessMutex mutex = new InterProcessMutex(client, "/curator/lock"); 
        //讀寫鎖
        //InterProcessReadWriteLock readWriteLock = new InterProcessReadWriteLock(client, "/readwriter");
        
        ExecutorService fixedThreadPool = Executors.newFixedThreadPool(5);
        
        for (int i = 0; i < 5; i++) {
            fixedThreadPool.submit(new Runnable() {
                @Override
                public void run() {
                    boolean flag = false;
                    try {
                        //嘗試獲取鎖,最多等待5秒
                        flag = mutex.acquire(5, TimeUnit.SECONDS);
                        Thread currentThread = Thread.currentThread();
                        if(flag){
                            System.out.println("線程"+currentThread.getId()+"獲取鎖成功");
                        }else{
                            System.out.println("線程"+currentThread.getId()+"獲取鎖失敗");
                        }
                        //模擬業務邏輯,延時4秒
                        Thread.sleep(4000);
                    } catch (Exception e) {
                        e.printStackTrace();
                    } finally{
                        if(flag){
                            try {
                                mutex.release();
                            } catch (Exception e) {
                                e.printStackTrace();
                            }
                        }
                    }
                }
            });
        }
    }
}

這裏咱們開啓5個線程,每一個線程獲取鎖的最大等待時間爲5秒,爲了模擬具體業務場景,方法中設置4秒等待時間。開始執行main方法,經過ZooInspector監控/curator/lock下的節點以下圖:ide

3.png

對,沒錯,設置4秒的業務處理時長就是爲了觀察生成了幾個順序節點。果真如案例中所述,每一個線程都會生成一個節點而且仍是有序的。觀察控制檯,咱們會發現只有兩個線程獲取鎖成功,另外三個線程超時獲取鎖失敗會自動刪除節點。線程執行完畢咱們刷新一下/curator/lock節點,發現剛纔建立的五個子節點已經不存在了。測試

相關文章
相關標籤/搜索