Zookeeper分佈式入門——ZK分佈式鎖的簡單實現
使用InterProcessMutex實現java
InterProcessMutex基於Zookeeper實現了分佈式的公平可重入互斥鎖,相似於單個JVM進程內的ReentrantLockapache
private static InterProcessMutex mutex = new InterProcessMutex(client, "/curator/lock");分佈式
//得到了鎖 public static boolean acquire(long time, TimeUnit unit){ try { return mutex.acquire(time,unit); } catch (Exception e) { e.printStackTrace(); return false; } }
//釋放鎖 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
對,沒錯,設置4秒的業務處理時長就是爲了觀察生成了幾個順序節點。果真如案例中所述,每一個線程都會生成一個節點而且仍是有序的。觀察控制檯,咱們會發現只有兩個線程獲取鎖成功,另外三個線程超時獲取鎖失敗會自動刪除節點。線程執行完畢咱們刷新一下/curator/lock節點,發現剛纔建立的五個子節點已經不存在了。測試