使用zookeeper實現分布式鎖

2021-09-20 08:26:11 字數 1838 閱讀 1700

在同乙個jvm程序中時,可以使用juc提供的一些鎖來解決多個執行緒競爭同乙個共享資源時候的執行緒安全問題,但是當多個不同機器上的不同jvm程序共同競爭同乙個共享資源時候,juc包的鎖就無能無力了,這時候就需要分布式鎖了。常見的有使用zk的最小版本,redis的set函式,資料庫鎖來實現,本節我們談談使用zookeeper的序列節點機制來實現乙個分布式鎖。

首先我們先來看看使用zk實現分布式鎖的原理,在zk中是使用檔案目錄的格式存放節點內容,其中節點型別分為:

如上圖,三個執行緒分別建立路徑為/root/node的節點,可知在zk伺服器端會在root下存在三個node節點,並且器編號唯一遞增。

具體在節點建立過程中,可以混合使用,比如臨時順序節點(ephemeral_sequential),這裡我們就使用臨時順序節點來實現分布式鎖。

分布式鎖實現:

下面我們看看**實現:

public class zookeeperdistributedlock 

}});

connectedsignal.await();

stat stat = zk.exists(root, false);

if (null == stat)

} catch (exception e)

}class lockwatcher implements watcher

@override

public void process(watchedevent event)

}public void lock()

string smallnode = sortednodes.first();

string prenode = sortednodes.lower(mynode);

if (mynode.equals( smallnode))

countdownlatch latch = new countdownlatch(1);

stat stat = zk.exists(prenode, new lockwatcher(latch));// 同時註冊監聽。

// 判斷比自己小乙個數的節點是否存在,如果不存在則無需等待鎖,同時註冊監聽

if (stat != null)

} catch (exception e)

}public void unlock()

nodeid.remove();

} catch (interruptedexception e) catch (keeperexception e) }}

zookeeperdistributedlock的建構函式建立zkclient,並且註冊了監聽事件,然後呼叫connectedsignal.await()掛起當前執行緒。當zkclient鏈結到伺服器後,會給***傳送syncconnected事件,***判斷當前鏈結已經建立了,則呼叫 connectedsignal.countdown();啟用當前執行緒,然後建立root節點。

獲取鎖的方法lock,內部首先建立/root/lockname的順序臨時節點,然後獲取/root下所有的孩子節點,並對子節點進行排序,然後判斷自己是不是最小的編號,如果是直接返回true標示獲取鎖成功。否者看比自己小乙個號的節點是否存在,存在則註冊該節點的事件,然後掛起當前執行緒,等待比自己小乙個數的節點釋放鎖後傳送節點刪除事件,事件裡面啟用當前執行緒。

釋放鎖的方法unlock比較簡單,就是簡單的刪除獲取鎖時候建立的節點。

使用zookeeper實現分布式鎖

zookeeper體系結構示意圖 功能 節點自選擇,例如 主節點1掛了,可以自動選擇節點2或者節點3作為主節點。節點之間可以自動備份資料,例如 節點1的資料會自動備份到節點2和3。單點部署,說明 把zookeeper裝在一台機器上,主從節點都在用乙個機器。節點具有排它性,可用於分布式鎖。利用此功能實...

Dubbo基於Zookeeper實現分布式服務

點關注不迷路,歡迎再訪!精簡部落格內容,盡量已行業術語來分享。努力做到對每一位認可自己的讀者負責。幫助別人的同時更是豐富自己的良機。既然是新手教學,肯定很多同學不明白什麼是分布式和遠端服務呼叫,為什麼要分布式,為什麼要遠端呼叫。下圖為例 以前什麼的都在乙個伺服器上,呼叫方法直接就自然而然呼叫了,沒啥...

Zookeeper實現分布式鎖

zookeeper實現分布式鎖 實現分布式環境下同步鎖的實現 author hao.wang date 2017 1 20 15 43 public class distributelockdemo implements watcher catch ioexception e catch inter...