91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

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

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

如何使用ZooKeeper實現Java跨JVM的分布式讀寫鎖

發布時間:2021-11-12 18:35:42 來源:億速云 閱讀:140 作者:柒染 欄目:云計算

這期內容當中小編將會給大家帶來有關 如何使用ZooKeeper實現Java跨JVM的分布式讀寫鎖,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。


讀寫鎖:

使用ZooKeeper實現Java跨JVM的分布式鎖(讀寫鎖)。


簡單介紹一下讀寫鎖,在使用讀寫鎖時, 多個客戶端(線程)可以同時獲取 “讀鎖”, 但是“寫入鎖”是排它的,只能單獨獲取。

1、假設A,B線程獲取到 “讀鎖”, 這時C線程就不能獲取 “寫鎖”。

2、假設C線程獲取了“寫鎖”,那么A,B線程就不能獲取“讀鎖”。

這在某種情況下會大幅度提高系統的性能,在單JVM進程內 Java已經提供了這種鎖的機制,可以參考ReentrantReadWriteLock這個類。


基于ZK的分布式讀寫鎖:

本文主要介紹ZK的分布式讀寫鎖,還是基于Curator客戶端實現。

package com.framework.code.demo.zook.lock;

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.framework.recipes.locks.InterProcessReadWriteLock;
import org.apache.curator.retry.ExponentialBackoffRetry;

public class ReadWriteLock {

	/**
	 * @param args
	 * @throws Exception 
	 */
	public static void main(String[] args) throws Exception {
		RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000,3);
		CuratorFramework client = CuratorFrameworkFactory
				.newClient("192.168.1.103:2181", retryPolicy);
		client.start();
		
		InterProcessReadWriteLock readWriteLock = new InterProcessReadWriteLock(client, "/read-write-lock");
		
		//讀鎖
		final InterProcessMutex readLock = readWriteLock.readLock();
		//寫鎖
		final InterProcessMutex writeLock = readWriteLock.writeLock();
		
		try {
			readLock.acquire();
			System.out.println(Thread.currentThread() + "獲取到讀鎖");
			
			new Thread(new Runnable() {
				@Override
				public void run() {
					try {
						//在讀鎖沒釋放之前不能讀取寫鎖。
						writeLock.acquire();
						System.out.println(Thread.currentThread() + "獲取到寫鎖");
					} catch (Exception e) {
						e.printStackTrace();
					} finally {
						try {
							writeLock.release();
						} catch (Exception e) {
							e.printStackTrace();
						}
					}
				}
			}).start();
			//停頓3000毫秒不釋放鎖,這時其它線程可以獲取讀鎖,卻不能獲取寫鎖。
			Thread.sleep(3000);
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			readLock.release();
		}
		
		Thread.sleep(1000000);
		client.close();
	}

}


如何使用ZooKeeper實現Java跨JVM的分布式讀寫鎖


實現原理:

實現原理與之前介紹的鎖的原理基本類似,這里主要說明一下不同之處。

1、寫入鎖在申請鎖時寫入的節點名稱是這樣的   xxxx-__WRIT__00000000xxx 例如:   _c_9b6e456b-94fe-47e7-b968-34027c094b7d-__WRIT__0000000006

2、讀取鎖在申請鎖時寫入的節點名稱是這樣的  xxxx-__READ__00000000xxx 例如:    _c_9b6e456b90-9c33-6294665cf525--b6448-__READ__0000000005

區別就是寫入鎖的字符串包含WRIT,讀取所包含READ


獲取鎖的區別:

1、寫入鎖在獲取鎖時的處理與前面文章介紹的原理一直,就是判斷自己前面還有沒有節點,如果沒有就可以獲取到鎖,如果有就等待前面的節點釋放鎖。

2、讀取鎖在獲取鎖時的處理是,判斷自己前面還有沒有寫入鎖的節點,也就是前面的節點是否包含WRIT,如果有那么等待前面的節點釋放鎖。

讀取所自己前面有 其它 讀取鎖節點 無所謂,它仍然可以獲取到鎖,這也就是讀取所可以多客戶端共享的原因。

上述就是小編為大家分享的 如何使用ZooKeeper實現Java跨JVM的分布式讀寫鎖了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

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

AI

永吉县| 伊宁县| 鄂托克前旗| 鄂尔多斯市| 玉树县| 渭南市| 广昌县| 江阴市| 台中县| 仁化县| 行唐县| 宕昌县| 漳浦县| 横山县| 海伦市| 祁阳县| 都安| 新绛县| 华蓥市| 平遥县| 濮阳市| 青神县| 定州市| 陆河县| 蒲城县| 沾化县| 梅州市| 隆昌县| 双江| 台东市| 若羌县| 诸暨市| 双城市| 鹤岗市| 洛川县| 安顺市| 新昌县| 白银市| 松江区| 洛浦县| 方城县|