這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān) 如何使用ZooKeeper實(shí)現(xiàn)Java跨JVM的分布式讀寫鎖,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
創(chuàng)新互聯(lián)公司-專業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性價(jià)比吳興網(wǎng)站開發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式吳興網(wǎng)站制作公司更省心,省錢,快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋吳興地區(qū)。費(fèi)用合理售后完善,十載實(shí)體公司更值得信賴。
讀寫鎖:
使用ZooKeeper實(shí)現(xiàn)Java跨JVM的分布式鎖(讀寫鎖)。
簡(jiǎn)單介紹一下讀寫鎖,在使用讀寫鎖時(shí), 多個(gè)客戶端(線程)可以同時(shí)獲取 “讀鎖”, 但是“寫入鎖”是排它的,只能單獨(dú)獲取。
1、假設(shè)A,B線程獲取到 “讀鎖”, 這時(shí)C線程就不能獲取 “寫鎖”。
2、假設(shè)C線程獲取了“寫鎖”,那么A,B線程就不能獲取“讀鎖”。
這在某種情況下會(huì)大幅度提高系統(tǒng)的性能,在單JVM進(jìn)程內(nèi) Java已經(jīng)提供了這種鎖的機(jī)制,可以參考ReentrantReadWriteLock這個(gè)類。
基于ZK的分布式讀寫鎖:
本文主要介紹ZK的分布式讀寫鎖,還是基于Curator客戶端實(shí)現(xiàn)。
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 { //在讀鎖沒(méi)釋放之前不能讀取寫鎖。 writeLock.acquire(); System.out.println(Thread.currentThread() + "獲取到寫鎖"); } catch (Exception e) { e.printStackTrace(); } finally { try { writeLock.release(); } catch (Exception e) { e.printStackTrace(); } } } }).start(); //停頓3000毫秒不釋放鎖,這時(shí)其它線程可以獲取讀鎖,卻不能獲取寫鎖。 Thread.sleep(3000); } catch (Exception e) { e.printStackTrace(); } finally { readLock.release(); } Thread.sleep(1000000); client.close(); } }
實(shí)現(xiàn)原理:
實(shí)現(xiàn)原理與之前介紹的鎖的原理基本類似,這里主要說(shuō)明一下不同之處。
1、寫入鎖在申請(qǐng)鎖時(shí)寫入的節(jié)點(diǎn)名稱是這樣的 xxxx-__WRIT__00000000xxx 例如: _c_9b6e456b-94fe-47e7-b968-34027c094b7d-__WRIT__0000000006
2、讀取鎖在申請(qǐng)鎖時(shí)寫入的節(jié)點(diǎn)名稱是這樣的 xxxx-__READ__00000000xxx 例如: _c_9b6e456b90-9c33-6294665cf525--b6448-__READ__0000000005
區(qū)別就是寫入鎖的字符串包含WRIT,讀取所包含READ
獲取鎖的區(qū)別:
1、寫入鎖在獲取鎖時(shí)的處理與前面文章介紹的原理一直,就是判斷自己前面還有沒(méi)有節(jié)點(diǎn),如果沒(méi)有就可以獲取到鎖,如果有就等待前面的節(jié)點(diǎn)釋放鎖。
2、讀取鎖在獲取鎖時(shí)的處理是,判斷自己前面還有沒(méi)有寫入鎖的節(jié)點(diǎn),也就是前面的節(jié)點(diǎn)是否包含WRIT,如果有那么等待前面的節(jié)點(diǎn)釋放鎖。
讀取所自己前面有 其它 讀取鎖節(jié)點(diǎn) 無(wú)所謂,它仍然可以獲取到鎖,這也就是讀取所可以多客戶端共享的原因。
上述就是小編為大家分享的 如何使用ZooKeeper實(shí)現(xiàn)Java跨JVM的分布式讀寫鎖了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。