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

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

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
ZooKeeper分布式鎖Curator源碼之三:可重入鎖并發(fā)加鎖

ZooKeeper 分布式鎖 Curator 源碼之三:可重入鎖并發(fā)加鎖

作者:程序員小航 2021-07-10 10:02:30
大數(shù)據(jù)
分布式 在了解了加鎖和鎖重入之后,最需要了解的還是在分布式場景下或者多線程并發(fā)加鎖是如何處理的?

三江侗網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)2013年至今到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)

前言

在了解了加鎖和鎖重入之后,最需要了解的還是在分布式場景下或者多線程并發(fā)加鎖是如何處理的?

1并發(fā)加鎖

先來看結(jié)果,在多線程對 /locks/lock_01 加鎖時(shí),是在后面又創(chuàng)建了新的臨時(shí)節(jié)點(diǎn)。

這塊在加鎖方法 CreateBuilderImpl#pathInForeground 中已經(jīng)介紹過

這里判斷 /locks/lock_01 路徑已經(jīng)存在,會直接創(chuàng)建新的臨時(shí)順序節(jié)點(diǎn)。

真正判斷鎖是否獲取成功,其實(shí)是在 LockInternals#attemptLock 方法中的 internalLockLoop 方法中。

加鎖結(jié)果及監(jiān)聽

internalLockLoop 方法的主要作用是判斷加鎖結(jié)果,以及獲取鎖失敗時(shí),對其他節(jié)點(diǎn)的監(jiān)聽。

  1. 獲取父節(jié)點(diǎn) /locks/lock_01 下的所有子節(jié)點(diǎn),按照從小到大排序,判斷自己是不是獲取到鎖,沒有獲取到就監(jiān)聽自己前一個(gè)節(jié)點(diǎn);
  2. 支持設(shè)置超時(shí)時(shí)間,超時(shí)直接返回失敗;
  3. 不支持設(shè)置超時(shí)時(shí)間或者還沒有超時(shí),則直接 wait 等待。

是否獲取鎖的代碼在 StandardLockInternalsDriver#getsTheLock

這塊就是判斷是否為最小節(jié)點(diǎn),因?yàn)樵?getSortedChildren 中已經(jīng)對所有節(jié)點(diǎn)排序,所以方法中的 List children 是有序的。

maxLeases 是在 InterProcessMutex 初始化的時(shí)候,指定的值為 1。

最終這里的結(jié)果是,判斷自己是不是最小,不是最小,就將 pathToWatch 設(shè)置為前一個(gè)節(jié)點(diǎn)。

只監(jiān)聽自己的前一個(gè)節(jié)點(diǎn),可以避免羊群效應(yīng)!

為什么要進(jìn)行等待呢?

因?yàn)槭菫榱朔乐篃o效自旋,因?yàn)檫@里有監(jiān)聽機(jī)制,會監(jiān)聽上一個(gè)節(jié)點(diǎn)是否釋放。

這塊是 ZooKeeper 的 Watcher 監(jiān)聽機(jī)制,在節(jié)點(diǎn)釋放的時(shí)候,會進(jìn)行回調(diào),然后使用 Java 的 notifyAll 方法通知所有的 wait 線程。然后這里的 while trye 會繼續(xù)執(zhí)行,重新檢查是否獲得鎖等。

2總結(jié)

本文主要介紹了基于 ZooKeeper 的分布式鎖框架 Curator 在并發(fā)場景下的鎖競爭問題。

重點(diǎn)需要了解的是:

  1. 為了避免羊群效應(yīng),臨時(shí)順序節(jié)點(diǎn),加鎖失敗后監(jiān)聽的是前一個(gè)節(jié)點(diǎn);
  2. 為了避免無效自旋,這里使用了 Java 的 wait/notifyAll 機(jī)制;
  3. 可以看出,默認(rèn)加鎖就是公平鎖。

本文轉(zhuǎn)載自微信公眾號「程序員小航」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系程序員小航公眾號。


新聞名稱:ZooKeeper分布式鎖Curator源碼之三:可重入鎖并發(fā)加鎖
轉(zhuǎn)載來源:http://www.5511xx.com/article/dphihjd.html