您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關 如何使用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(); } }
實現原理:
實現原理與之前介紹的鎖的原理基本類似,這里主要說明一下不同之處。
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的分布式讀寫鎖了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。