亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

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

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

如何使用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

河西区| 密云县| 东阳市| 昆山市| 霍林郭勒市| 潼南县| 承德县| 克拉玛依市| 南皮县| 万州区| 隆德县| 望江县| 新闻| 绥德县| 彭山县| 闽清县| 那坡县| 健康| 富锦市| 邹城市| 大英县| 广河县| 西充县| 岳阳县| 札达县| 雅江县| 静安区| 房产| 花莲县| 芒康县| 上饶县| 策勒县| 大方县| 彩票| 监利县| 孙吴县| 漯河市| 武安市| 常山县| 沅江市| 南木林县|