中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

zookeeper中怎么實現分布式排它鎖

發布時間:2021-06-24 17:37:48 來源:億速云 閱讀:208 作者:Leah 欄目:云計算

zookeeper中怎么實現分布式排它鎖,很多新手對此不是很清楚,為了幫助大家解決這個難題,下面小編將為大家詳細講解,有這方面需求的人可以來學習下,希望你能有所收獲。

一:分布式互斥鎖
    分布式鎖主要用來在分布式系統中同步共享資源的訪問,在zookeeper中,并沒有像JAVA里一樣有Synchronized或者是ReentrantLock機制來實現鎖機制,但是在zookeeper中,實現起來更簡單:
  我們可以講將zk的一個數據節點代表一個鎖,當多個客戶端同時調用create()節點創建節點的時候,zookeeper會保證只會有一個客戶端創建成功,那么我們就可以讓這個創建成功的客戶端讓其持有鎖,而其它的客戶端則注冊Watcher監聽
  當持有鎖的客戶端釋放鎖后,監聽的客戶端就會收到Watcher通知,然后再去試圖獲取鎖,這樣反復即可。

二:大概流程
zookeeper中怎么實現分布式排它鎖

三 :代碼示例

import java.util.Collections;
import java.util.List;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
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.Watcher.Event.KeeperState;
import org.apache.zookeeper.ZooDefs.Ids;
import org.apache.zookeeper.ZooKeeper;
import org.apache.zookeeper.data.Stat;

/**
 * 基于zookeeper實現互斥鎖
 * 
 *
 */
public class DistributedClient {
	private static final int SESSION_TIMEOUT = 5000;
	private String hosts = "192.168.8.88:2181,192.168.8.88:2182,192.168.8.88:2183";
	private String groupNode = "locks";
	private String subNode = "sub";
	private ZooKeeper zk;
	// 當前client創建的子節點
	private volatile String thisPath;
	// 當前client等待的子節點
	private volatile String waitPath;
	private CountDownLatch latch = new CountDownLatch(1);

	/**
	 * 連接zookeeper
	 * 
	 * @param countDownLatch
	 */
	public void connectZookeeper(final CountDownLatch countDownLatch)
			throws Exception {
		zk = new ZooKeeper(hosts, SESSION_TIMEOUT, new Watcher() {
			@Override
			public void process(WatchedEvent event) {
				try {
					if (event.getState() == KeeperState.SyncConnected) {
						latch.countDown();
					}

					// 發生了waitPath的刪除事件
					/**
					 * 假設某個client在獲得鎖之前掛掉了, 由于client創建的節點是ephemeral類型的,
					 * 因此這個節點也會被刪除, 從而導致排在這個client之后的client提前獲得了鎖.
					 * 此時會存在多個client同時訪問共享資源. 如何解決這個問題呢? 可以在接到刪除通知的時候,
					 * 進行一次確認, 確認當前的thisPath是否真的是列表中最小的節點.
					 */
					if (event.getType() == EventType.NodeDeleted
							&& event.getPath().equals(waitPath)) {
						// 確認thisPath是否真的是列表中的最小節點
						List<String> childrenNodes = zk.getChildren("/"
								+ groupNode, false);
						String thisNode = thisPath
								.substring(("/">

    可能的運行結果如下:

當前線程:pool-1-thread-16獲得了鎖:/locks/sub0000000053
當前線程:pool-1-thread-16已經釋放了鎖,讓其它客戶端有機會去獲取,/locks/sub0000000053
當前線程:pool-1-thread-20-EventThread獲得了鎖:/locks/sub0000000054
當前線程:pool-1-thread-20-EventThread已經釋放了鎖,讓其它客戶端有機會去獲取,/locks/sub0000000054
當前線程:pool-1-thread-5-EventThread獲得了鎖:/locks/sub0000000055
當前線程:pool-1-thread-5-EventThread已經釋放了鎖,讓其它客戶端有機會去獲取,/locks/sub0000000055
當前線程:pool-1-thread-2-EventThread獲得了鎖:/locks/sub0000000056
當前線程:pool-1-thread-2-EventThread已經釋放了鎖,讓其它客戶端有機會去獲取,/locks/sub0000000056
當前線程:pool-1-thread-6-EventThread獲得了鎖:/locks/sub0000000057
當前線程:pool-1-thread-6-EventThread已經釋放了鎖,讓其它客戶端有機會去獲取,/locks/sub0000000057
當前線程:pool-1-thread-10-EventThread獲得了鎖:/locks/sub0000000058
當前線程:pool-1-thread-10-EventThread已經釋放了鎖,讓其它客戶端有機會去獲取,/locks/sub0000000058
當前線程:pool-1-thread-3-EventThread獲得了鎖:/locks/sub0000000059
當前線程:pool-1-thread-3-EventThread已經釋放了鎖,讓其它客戶端有機會去獲取,/locks/sub0000000059
當前線程:pool-1-thread-11-EventThread獲得了鎖:/locks/sub0000000060
當前線程:pool-1-thread-11-EventThread已經釋放了鎖,讓其它客戶端有機會去獲取,/locks/sub0000000060
當前線程:pool-1-thread-7-EventThread獲得了鎖:/locks/sub0000000061
當前線程:pool-1-thread-7-EventThread已經釋放了鎖,讓其它客戶端有機會去獲取,/locks/sub0000000061
當前線程:pool-1-thread-13-EventThread獲得了鎖:/locks/sub0000000062
當前線程:pool-1-thread-13-EventThread已經釋放了鎖,讓其它客戶端有機會去獲取,/locks/sub0000000062
當前線程:pool-1-thread-15-EventThread獲得了鎖:/locks/sub0000000063
當前線程:pool-1-thread-15-EventThread已經釋放了鎖,讓其它客戶端有機會去獲取,/locks/sub0000000063
當前線程:pool-1-thread-1-EventThread獲得了鎖:/locks/sub0000000064
當前線程:pool-1-thread-1-EventThread已經釋放了鎖,讓其它客戶端有機會去獲取,/locks/sub0000000064
當前線程:pool-1-thread-18-EventThread獲得了鎖:/locks/sub0000000065
當前線程:pool-1-thread-18-EventThread已經釋放了鎖,讓其它客戶端有機會去獲取,/locks/sub0000000065
當前線程:pool-1-thread-4-EventThread獲得了鎖:/locks/sub0000000066
當前線程:pool-1-thread-4-EventThread已經釋放了鎖,讓其它客戶端有機會去獲取,/locks/sub0000000066
當前線程:pool-1-thread-19-EventThread獲得了鎖:/locks/sub0000000067
當前線程:pool-1-thread-19-EventThread已經釋放了鎖,讓其它客戶端有機會去獲取,/locks/sub0000000067
當前線程:pool-1-thread-14-EventThread獲得了鎖:/locks/sub0000000068
當前線程:pool-1-thread-14-EventThread已經釋放了鎖,讓其它客戶端有機會去獲取,/locks/sub0000000068
當前線程:pool-1-thread-9-EventThread獲得了鎖:/locks/sub0000000069
當前線程:pool-1-thread-9-EventThread已經釋放了鎖,讓其它客戶端有機會去獲取,/locks/sub0000000069
當前線程:pool-1-thread-8-EventThread獲得了鎖:/locks/sub0000000070
當前線程:pool-1-thread-8-EventThread已經釋放了鎖,讓其它客戶端有機會去獲取,/locks/sub0000000070
當前線程:pool-1-thread-12-EventThread獲得了鎖:/locks/sub0000000071
當前線程:pool-1-thread-12-EventThread已經釋放了鎖,讓其它客戶端有機會去獲取,/locks/sub0000000071
當前線程:pool-1-thread-17-EventThread獲得了鎖:/locks/sub0000000072
當前線程:pool-1-thread-17-EventThread已經釋放了鎖,讓其它客戶端有機會去獲取,/locks/sub0000000072

看完上述內容是否對您有幫助呢?如果還想對相關知識有進一步的了解或閱讀更多相關文章,請關注億速云行業資訊頻道,感謝您對億速云的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

福清市| 兴海县| 长顺县| 广平县| 伊金霍洛旗| 营口市| 奉化市| 永宁县| 海安县| 抚州市| 西畴县| 霍林郭勒市| 休宁县| 道孚县| 白朗县| 安乡县| 若尔盖县| 宣汉县| 福州市| 滦平县| 上栗县| 青阳县| 栾川县| 龙泉市| 马关县| 那坡县| 土默特左旗| 广东省| 乌鲁木齐县| 扬州市| 调兵山市| 特克斯县| 二连浩特市| 长丰县| 宁武县| 伽师县| 揭阳市| 南汇区| 马尔康县| 宝山区| 夏河县|