日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
ZooKeeper分布式鎖Curator源碼05:分布式讀寫鎖和聯(lián)鎖

ZooKeeper 分布式鎖 Curator 源碼 05:分布式讀寫鎖和聯(lián)鎖

作者:程序員小航 2021-07-16 07:57:34

開發(fā)

前端

分布式

分布式 Curator 同樣支持分布式讀寫鎖[1] 和聯(lián)鎖[2],只需要使用 InterProcessReadWriteLock 即可,來一起看看它的源碼以及實(shí)現(xiàn)方式。

成都創(chuàng)新互聯(lián)公司專業(yè)為企業(yè)提供武義網(wǎng)站建設(shè)、武義做網(wǎng)站、武義網(wǎng)站設(shè)計(jì)、武義網(wǎng)站制作等企業(yè)網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì)與制作、武義企業(yè)網(wǎng)站模板建站服務(wù),十載武義做網(wǎng)站經(jīng)驗(yàn),不只是建網(wǎng)站,更提供有價(jià)值的思路和整體網(wǎng)絡(luò)服務(wù)。

前言

Curator 同樣支持分布式讀寫鎖[1] 和聯(lián)鎖[2],只需要使用 InterProcessReadWriteLock 即可,來一起看看它的源碼以及實(shí)現(xiàn)方式。

1.使用方式

  
 
 
 
  1. public class CuratorDemo {
  2.     public static void main(String[] args) throws Exception {
  3.         String connectString = "127.0.0.1:2181,127.0.0.1:2182,127.0.0.1:2183";
  4.         RetryPolicy retryPolicy = new ExponentialBackoffRetry(1000, 3);
  5.         CuratorFramework client = CuratorFrameworkFactory
  6.                 .builder()
  7.                 .connectString(connectString)
  8.                 .retryPolicy(retryPolicy)
  9.                 .build();
  10.         client.start();
  11.   InterProcessReadWriteLock lock = new InterProcessReadWriteLock(client, "/locks/lock_01");
  12.   lock.readLock().acquire();
  13.   lock.readLock().release();
  14.   lock.writeLock().acquire();
  15.   lock.writeLock().release();
  16.     }
  17. }

2.源碼

讀鎖寫鎖都是基于 InterProcessMutex 實(shí)現(xiàn)的,所以基本都和 InterProcessMutex 沒有區(qū)別。不過這里生成的鎖名字不再是 -lock- 而是換成了 __WRIT__ 和 __READ__。

讀鎖加鎖節(jié)點(diǎn)名為 /locks/lock_01/_c_44a8eaf8-f177-403a-92bf-9119591b54d5-__READ__0000000000,寫鎖解鎖節(jié)點(diǎn)名為 _c_2e5dde98-c548-4f8b-a798-821ee8330eb6-__WRIT__0000000001。

其中創(chuàng)建節(jié)點(diǎn)時(shí)和可重入鎖 InterProcessMutex 沒有區(qū)別,唯一的區(qū)別就是在 internalLockLoop 方法中,判斷鎖獲取結(jié)果時(shí)有區(qū)別。

當(dāng)可重入鎖時(shí)是在 StandardLockInternalsDriver#getsTheLock 判斷當(dāng)前節(jié)點(diǎn)是否為最小節(jié)點(diǎn)。

而讀寫鎖是在 InterProcessReadWriteLock#InterProcessReadWriteLock 中重寫了 getsTheLock 方法。

讀鎖加鎖

讀鎖加鎖,當(dāng)前線程直接返回成功,也就是說當(dāng)前線程讀寫不互斥的。

如果是其他線程,則遍歷所有子節(jié)點(diǎn)。

子節(jié)點(diǎn)包含寫鎖,當(dāng)前節(jié)點(diǎn)在子節(jié)點(diǎn)有序集合的索引小于寫鎖的索引則直接獲得鎖,否則獲取失敗;

子節(jié)點(diǎn)不包含寫鎖,則當(dāng)前節(jié)點(diǎn)在子節(jié)點(diǎn)的有序集合的 index < Integer.MAX_VALUE (2147483647) 即可。

就是說讀鎖最多支持 2147483647 個(gè)。

寫鎖加鎖

寫鎖加鎖直接復(fù)用的可重入鎖 InterProcessMutex 的邏輯,所以這里寫鎖和寫鎖,以及讀鎖和寫鎖都是互斥的。

3.聯(lián)鎖

聯(lián)鎖的使用,就是將 InterProcessLock 放到集合中,然后進(jìn)行統(tǒng)一加鎖。

加鎖就遍歷集合,依次進(jìn)行加鎖。

4.總結(jié)

本文介紹了讀寫鎖和聯(lián)鎖,其實(shí)都是基于最基礎(chǔ)的可重入鎖進(jìn)行封裝,理解了可重入鎖的概念,后面的簡(jiǎn)單看下思想即可。

引用鏈接:

[1]Shared Reentrant Read Write Lock: https://curator.apache.org/curator-recipes/shared-reentrant-read-write-lock.html

[2]Multi Shared Lock: https://curator.apache.org/curator-recipes/multi-shared-lock.html


網(wǎng)站標(biāo)題:ZooKeeper分布式鎖Curator源碼05:分布式讀寫鎖和聯(lián)鎖
文章鏈接:http://www.5511xx.com/article/cocjhcs.html