分布式鎖簡析

1. 為什么要使用分布式鎖?

場景
  1. 變量A存在JVM1购城、JVM2、JVM3三個(gè)JVM(進(jìn)程)內(nèi)存中
  2. 變量A同時(shí)都會(huì)在JVM分配一塊內(nèi)存虐译,三個(gè)請(qǐng)求發(fā)過來同時(shí)對(duì)這個(gè)變量進(jìn)行操作(例如3個(gè)人買書,書的庫存只有2本)吴趴,顯然結(jié)果是不對(duì)的
  3. 不是同時(shí)發(fā)過來漆诽,三個(gè)請(qǐng)求分別操作三個(gè)不同JVM內(nèi)存區(qū)域的數(shù)據(jù),變量A之間不存在共享,也不具有可見性,處理的結(jié)果也是不對(duì)的
    注:這個(gè)變量主要體現(xiàn)在一個(gè)類中有一個(gè)成員變量尿褪,它是一個(gè)有狀態(tài)的對(duì)象

2. 分布式鎖應(yīng)該具備哪些條件地来?

  1. 在分布式系統(tǒng)環(huán)境下,一個(gè)方法在同一時(shí)間只能被一個(gè)機(jī)器的一個(gè)線程執(zhí)行
  2. 高可用的獲取與釋放鎖(zookeeper一直都能提供鎖密末,并且釋放鎖)
  3. 高性能的獲取鎖與釋放鎖(快)
  4. 具備可重入性特性(可理解為重新進(jìn)入,由多于一個(gè)任務(wù)并發(fā)使用,而不必?fù)?dān)心數(shù)據(jù)錯(cuò)誤)

可重入(reentrant)函數(shù)可以由多于一個(gè)任務(wù)并發(fā)使用楞捂,而不必?fù)?dān)心數(shù)據(jù)錯(cuò)誤。相反趋厉,不可重入(non-reentrant)函數(shù)不能由超過一個(gè)任務(wù)所共享寨闹,除非能確保函數(shù)的互斥(或者使用信號(hào)量,或者在代碼的關(guān)鍵部分禁用中斷)君账》北ぃ可重入函數(shù)可以在任意時(shí)刻被中斷,稍后再繼續(xù)運(yùn)行乡数,不會(huì)丟失數(shù)據(jù)椭蹄。可重入函數(shù)要么使用本地變量净赴,要么在使用全局變量時(shí)保護(hù)自己的數(shù)據(jù)绳矩。
可重入函數(shù):
1.不為連續(xù)的調(diào)用持有靜態(tài)數(shù)據(jù)。
2.不返回指向靜態(tài)數(shù)據(jù)的指針劫侧;所有數(shù)據(jù)都由函數(shù)的調(diào)用者提供埋酬。
3.使用本地?cái)?shù)據(jù)哨啃,或者通過制作全局?jǐn)?shù)據(jù)的本地拷貝來保護(hù)全局?jǐn)?shù)據(jù)。
4.如果必須訪問全局變量写妥,記住利用互斥信號(hào)量來保護(hù)全局變量拳球。
5.絕不調(diào)用任何不可重入函數(shù)。

  1. 具備鎖失效機(jī)制,防止死鎖

回顧:多線程是如何避免死鎖的?
我們只要破壞產(chǎn)生死鎖的四個(gè)條件中的其中一個(gè)就可以了珍特。
1.破壞互斥條件
這個(gè)條件我們沒有辦法破壞祝峻,因?yàn)槲覀冇面i本來就是想讓他們互斥的(臨界資源需要互斥訪問)。
2.破壞請(qǐng)求與保持條件
一次性申請(qǐng)所有的資源扎筒。
3.破壞不剝奪條件
占用部分資源的線程進(jìn)一步申請(qǐng)其他資源時(shí)莱找,如果申請(qǐng)不到,可以主動(dòng)釋放它占有的資源嗜桌。
4.破壞循環(huán)等待條件
靠按序申請(qǐng)資源來預(yù)防奥溺。按某一順序申請(qǐng)資源,釋放資源則反序釋放骨宠。破壞循環(huán)等待條件浮定。
我們對(duì)線程 2 的代碼修改成下面這樣就不會(huì)產(chǎn)生死鎖了

  1. 具備非阻塞鎖特性,即沒有獲取到鎖將直接返回獲取鎖失敗
    說明:類似于熔斷機(jī)制,避免大量申請(qǐng)鎖等待而導(dǎo)致的阻塞.

什么是Zookeeper

Zookeeper是一個(gè)為分布式應(yīng)用提供一致性服務(wù)的開源組件,它內(nèi)部是一個(gè)分層的文件系統(tǒng)目錄樹結(jié)構(gòu),規(guī)定同一個(gè)目錄下只能有一個(gè)唯一的文件名,即同一目錄下文件名不能重復(fù)

Zookeeper實(shí)現(xiàn)分布式鎖的步驟

  1. 創(chuàng)建一個(gè)目錄MyZookeeper
  2. 線程A想要獲取鎖就在MyZookeeper目錄下創(chuàng)建一個(gè)臨時(shí)順序節(jié)點(diǎn)
  3. 線程A獲取MyZookeeper目錄下所有的子節(jié)點(diǎn),然后獲取比自己小的兄弟節(jié)點(diǎn),如果不存在,則說明當(dāng)前線程順序號(hào)最小,獲得鎖
  4. 此時(shí)線程B也獲取鎖,它會(huì)先獲取所有的MyZookeeper節(jié)點(diǎn)下的子節(jié)點(diǎn),如果判斷自己不是最小的節(jié)點(diǎn),就設(shè)置監(jiān)聽比自己次小的節(jié)點(diǎn)
  5. 線程A處理完畢,刪除自己的節(jié)點(diǎn),線程B監(jiān)聽到變更事件(加入線程B次小的節(jié)點(diǎn)是A),還是判斷下自己是不是最小的節(jié)點(diǎn),如果是就獲得鎖

參考:單點(diǎn)故障與分布式鎖

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市层亿,隨后出現(xiàn)的幾起案子桦卒,更是在濱河造成了極大的恐慌,老刑警劉巖匿又,帶你破解...
    沈念sama閱讀 219,427評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件方灾,死亡現(xiàn)場離奇詭異,居然都是意外死亡碌更,警方通過查閱死者的電腦和手機(jī)裕偿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來针贬,“玉大人击费,你說我怎么就攤上這事¤胨” “怎么了蔫巩?”我有些...
    開封第一講書人閱讀 165,747評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長快压。 經(jīng)常有香客問我圆仔,道長,這世上最難降的妖魔是什么蔫劣? 我笑而不...
    開封第一講書人閱讀 58,939評(píng)論 1 295
  • 正文 為了忘掉前任坪郭,我火速辦了婚禮,結(jié)果婚禮上脉幢,老公的妹妹穿的比我還像新娘歪沃。我一直安慰自己嗦锐,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評(píng)論 6 392
  • 文/花漫 我一把揭開白布沪曙。 她就那樣靜靜地躺著奕污,像睡著了一般。 火紅的嫁衣襯著肌膚如雪液走。 梳的紋絲不亂的頭發(fā)上碳默,一...
    開封第一講書人閱讀 51,737評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音缘眶,去河邊找鬼嘱根。 笑死,一個(gè)胖子當(dāng)著我的面吹牛巷懈,可吹牛的內(nèi)容都是我干的该抒。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼砸喻,長吁一口氣:“原來是場噩夢啊……” “哼柔逼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起割岛,我...
    開封第一講書人閱讀 39,352評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎犯助,沒想到半個(gè)月后癣漆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,834評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡剂买,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評(píng)論 3 338
  • 正文 我和宋清朗相戀三年惠爽,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瞬哼。...
    茶點(diǎn)故事閱讀 40,133評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡婚肆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出坐慰,到底是詐尸還是另有隱情较性,我是刑警寧澤,帶...
    沈念sama閱讀 35,815評(píng)論 5 346
  • 正文 年R本政府宣布结胀,位于F島的核電站赞咙,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏糟港。R本人自食惡果不足惜攀操,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望秸抚。 院中可真熱鬧速和,春花似錦歹垫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至慈迈,卻和暖如春若贮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背痒留。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評(píng)論 1 272
  • 我被黑心中介騙來泰國打工谴麦, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人伸头。 一個(gè)月前我還...
    沈念sama閱讀 48,398評(píng)論 3 373
  • 正文 我出身青樓匾效,卻偏偏與公主長得像,于是被迫代替她去往敵國和親恤磷。 傳聞我的和親對(duì)象是個(gè)殘疾皇子面哼,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容