zookeeper 競爭鎖例項
package com.hgs.sharelocks; import java.util.Collections; import java.util.List; import org.apache.zookeeper.CreateMode; import org.apache.zookeeper.WatchedEvent; import org.apache.zookeeper.Watcher; import org.apache.zookeeper.Watcher.Event.EventType; import org.apache.zookeeper.ZooDefs.Ids; import org.apache.zookeeper.ZooKeeper; public class ZKsharelocks { private ZooKeeper zk = null; private final static String connectString = "192.168.6.131:2181,192.168.6.132:2181,192.168.6.133:2181"; private final static int sessionTimeout = 2000; private final static String parentNode="/servers"; private final static String subNode="/sub"; private volatile String myPath = null; private boolean lockflag = false; public static void main(String[] args) throws Exception { ZKsharelocks sl = new ZKsharelocks(); sl.getConnect(); Thread.sleep(Long.MAX_VALUE); } public void getConnect() throws Exception{ //建立例項 zk = new ZooKeeper(connectString, sessionTimeout, new Watcher() { @Override public void process(WatchedEvent event) { //判斷事件的型別以及路徑是否是業務路徑 if(event.getType()==EventType.NodeChildrenChanged&&event.getPath().equals(parentNode)) { List<String> inchild = null; try { //得到子節點,繼續監聽 inchild = zk.getChildren(parentNode, true); //排序 Collections.sort(inchild); //判斷返回的時間路徑不是null並且最小的子路經是當天路徑 if(myPath != null&&inchild.size()>0&&inchild.indexOf(myPath.substring(parentNode.length()+1))==0) { doSomthing(); Thread.sleep(2000); myPath=zk.create(parentNode+subNode, null, Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL); } } catch (Exception e) { e.printStackTrace(); } } } }); //首先建立一個臨時的序列的條目 myPath=zk.create(parentNode+subNode, null, Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL); //得到父節點下面的子目錄數並進行監聽 List<String> childs = zk.getChildren(parentNode, true); //判斷進入到的時候是否只有自己,如果只有自己則可以做業務邏輯 if(childs.size()==1) { //業務方法,在業務方法內有刪除myPath條目的操作 doSomthing(); //刪除完成後繼續 myPath=zk.create(parentNode+subNode, null, Ids.OPEN_ACL_UNSAFE, CreateMode.EPHEMERAL_SEQUENTIAL); } } public void doSomthing() throws Exception { System.out.println("get the lock..."+Thread.currentThread().getName()); //得到鎖完成業務後,刪除持有的鎖,即刪除該條目 zk.delete(myPath, -1); } }
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31506529/viewspace-2200046/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- SpringBoot+Dubbo+Zookeeper 例項Spring Boot
- 【GO】27. zookeeper golang庫go-zookeeper例項Golang
- golang中的鎖競爭問題Golang
- AQS原始碼探究之競爭鎖資源AQS原始碼
- 【zookeeper】zookeeper分散式鎖分散式
- 例項詳解 Java 死鎖與破解死鎖Java
- Java中常見死鎖與活鎖的例項Java
- 聊一聊 dotnet-trace 調查 lock鎖競爭
- MySQL共享鎖:使用與例項詳解MySql
- zookeeper分散式鎖分散式
- ZooKeeper 分散式鎖分散式
- Zookeeper-分散式鎖分散式
- zookeeper 分散式鎖解析分散式
- Zookeeper(5)---分散式鎖分散式
- 十九、Redis分散式鎖、Zookeeper分散式鎖Redis分散式
- 在由價格競爭向產品競爭、服務競爭等領域延伸的過程中
- 【多執行緒與高併發3】常用鎖例項執行緒
- 6 zookeeper實現分散式鎖分散式
- ZooKeeper分散式鎖的實現分散式
- 分散式鎖之Zookeeper實現分散式
- 分散式鎖實現(二):Zookeeper分散式
- ZooKeeper 分散式鎖 Curator 原始碼 01:可重入鎖分散式原始碼
- 競爭條件入門
- Linux 併發與競爭Linux
- 產品的競爭力
- BP-Wrapper:無鎖競爭的快取替換演算法系統框架APP快取演算法框架
- php例項化物件的例項方法PHP物件
- 多執行緒併發鎖分類以及簡單例項執行緒單例
- ZooKeeper 分散式鎖 Curator 原始碼 03:可重入鎖併發加鎖分散式原始碼
- 2020年夏天就業競爭越發激烈,如何迅速提高自己的競爭力?就業
- 比特幣學習筆記——————9、競爭幣、競爭塊鏈和應用程式比特幣筆記
- “印度北上廣”:競爭與追逐
- 如何提高個人競爭力
- 死鎖-舉例
- unittest例項
- OkHttpClient例項HTTPclient
- jQuery 例項jQuery
- ZooKeeper 分散式鎖 Curator 原始碼 02:可重入鎖重複加鎖和鎖釋放分散式原始碼