用zkClient基於zk實現分布式鎖

2021-09-25 09:33:34 字數 2536 閱讀 5757

用zk做分布式鎖的基本原理:zk的節點特性,在同級目錄下,相同名稱的節點只有乙個

基於該思想,有2中建立分布式鎖的思路,分別如下:

給乙個唯一的值,幾個程序同時去建立該節點,只有乙個能成功,成功的程序處理完業務之後,刪除掉該節點,剩下的程序又去競爭-----缺點,當競爭的節點較多時,會產生驚群效應;

另乙個思路是:多個程序去建立臨時有序節點,最小序號的節點獲得鎖,依次發生下去,通過註冊監聽事件,達到通知的目的

本文是基於第二種思想去實現的:**如下

public class distributelock implements lock

}static

@override

public void lock()

try catch (exception e)

}private void waitforlock(string prev) throws exception

@override

public void handledatadeleted(string datapath) throws exception

});latch.await(); }}

@override

public void lockinterruptibly() throws interruptedexception

@override

public boolean trylock()

string first = sortset.first();

if(first.equals(current_path.replace(root_path+"/", "")))

sortedsetheadset = sortset.headset(current_path.replace(root_path+"/", ""));

if(!headset.isempty())

return false;

}@override

public boolean trylock(long time, timeunit unit) throws interruptedexception

@override

public void unlock()

@override

public condition newcondition() 在本地測試**入下:

public static void main(string args) catch (exception e)

},"thread--"+i).start();

countdownlatch.countdown();

}}

輸出如下:

thread–6->建立節點:/dubbo/0000000148

thread–7->建立節點:/dubbo/0000000149

thread–8->建立節點:/dubbo/0000000150

thread–2->建立節點:/dubbo/0000000151

thread–1->建立節點:/dubbo/0000000157

thread–0->建立節點:/dubbo/0000000152

thread–4->建立節點:/dubbo/0000000156

thread–3->建立節點:/dubbo/0000000153

thread–5->建立節點:/dubbo/0000000154

thread–9->建立節點:/dubbo/0000000155

thread–6->/dubbo/0000000148獲得鎖成功

thread–2等待的節點是:/dubbo/0000000150

thread–7等待的節點是:/dubbo/0000000148

thread–4等待的節點是:/dubbo/0000000155

thread–1等待的節點是:/dubbo/0000000156

thread–3等待的節點是:/dubbo/0000000152

thread–0等待的節點是:/dubbo/0000000151

thread–5等待的節點是:/dubbo/0000000153

thread–9等待的節點是:/dubbo/0000000154

thread–8等待的節點是:/dubbo/0000000149

thread–7->/dubbo/0000000149獲得鎖成功

thread–8->/dubbo/0000000150獲得鎖成功

thread–2->/dubbo/0000000151獲得鎖成功

thread–0->/dubbo/0000000152獲得鎖成功

thread–3->/dubbo/0000000153獲得鎖成功

thread–5->/dubbo/0000000154獲得鎖成功

thread–9->/dubbo/0000000155獲得鎖成功

thread–4->/dubbo/0000000156獲得鎖成功

thread–1->/dubbo/0000000157獲得鎖成功

希望對學習zk實現分布式鎖實現的同學有幫助

基於zk的配置管理

com.netflix.archaiusgroupid archaius coreartifactid 0.6.5version org.apache.curatorgroupid curator clientartifactid exclusion exclusions dependency co...

用C 實現基於用C 實現基於TCP協議的網路通訊

tcp 協議是乙個基本的網路 協議,基本上所有的網路服務都是基於 tcp協議的,如http,ftp等等,所以要了解網路程式設計就必須了解基於 tcp協議的程式設計。然而 tcp協議是乙個龐雜的體系,要徹底的弄清楚它的實現不是一天兩天的功夫,所幸的是在.net framework環境下,我們不必要去追...

基於ZK的分布式集群管理

分布式集群管理常見的需求 主動檢視線上服務節點 檢視服務節點資源使用情況 服務離線通知 服務資源 cpu 記憶體 硬碟 超出閥值通知 架構設計 節點結構 root manger 根節點 server00001 服務節點 1 server00002 服務節點 2 server.n 服務節點 n 服務狀...