應(yīng)用場景:
1.單體架構(gòu)中利用Java本身的ReentrantLock 和 synchronized? ? 來做互斥鎖 。
2.在分布式系統(tǒng) 實現(xiàn)相同的功能時? 因為在多進程中運用分布式鎖
3.秒殺系統(tǒng)等實際應(yīng)用場景
3.實現(xiàn)一個分布式鎖應(yīng)該具備的特性:
高可用抗楔、高性能的獲取鎖與釋放鎖
在分布式系統(tǒng)環(huán)境下,一個方法或者變量同一時間只能被一個線程操作
具備鎖失效機制,網(wǎng)絡(luò)中斷或宕機無法釋放鎖時栅迄,鎖必須被刪除,防止死鎖
具備阻塞鎖特性屯阀,即沒有獲取到鎖固灵,則繼續(xù)等待獲取鎖
具備非阻塞鎖特性捅伤,即沒有獲取到鎖,則直接返回獲取鎖失敗
具備可重入特性巫玻,一個線程中可以多次獲取同一把鎖丛忆,比如一個線程在執(zhí)行一個帶鎖的方法,該方法中又調(diào)用了另一個需要相同鎖的方法仍秤,則該線程可以直接執(zhí)行調(diào)用的方法熄诡,而無需重新獲得鎖
4.在之前的秒殺案例中,我們曾介紹過關(guān)于分布式鎖幾種實現(xiàn)方式:
基于數(shù)據(jù)庫實現(xiàn)分布式鎖
基于 Redis 實現(xiàn)分布式鎖
基于 Zookeeper 實現(xiàn)分布式鎖
5.首先用zookeeper 實現(xiàn)的分布式鎖
原理:zookeeper 內(nèi)部 是分層的樹形結(jié)構(gòu)的 文件系統(tǒng) 規(guī)定同一個目錄下面唯一的文件名 和 利用 臨時節(jié)點 和 wacth 機制 每個鎖占用一個普通節(jié)點/lock目錄下創(chuàng)建臨時節(jié)點徒扶,創(chuàng)建成功的話表示獲取鎖成功粮彤,失敗的的話 watch/lock節(jié)點,有刪除操作后再爭取鎖姜骡,臨時節(jié)點好處在于當(dāng)進程掛掉了能自動上鎖的節(jié)點自動刪除 也就是取消鎖导坟。
但是也有缺點。就是羊群效應(yīng)? 也就是等待的節(jié)點 一同創(chuàng)建節(jié)點 并發(fā)量很大圈澈。
創(chuàng)建步驟:
1)惫周,創(chuàng)建一個目錄為lock的目錄
2),線程A獲取目錄下面的臨時節(jié)點
3)康栈,獲取該目錄下面的所有子節(jié)點递递,然后獲取比自己小的子節(jié)點喷橙,如果不存在,說明當(dāng)前節(jié)點為最下節(jié)點登舞,獲取鎖
4)贰逾,線程B創(chuàng)建臨時節(jié)點并獲取所有兄弟節(jié)點,判斷自己的節(jié)點菠秒,設(shè)置監(jiān)聽比自己小的節(jié)點(防止羊群效應(yīng))
5)疙剑,線程A處理完,刪除自己的節(jié)點践叠,線程B監(jiān)聽到變更言缤,判斷自己是最小節(jié)點,獲取鎖禁灼。
實現(xiàn)階段:
1管挟,一般有兩種方法實現(xiàn)分布式鎖
第一種自己實現(xiàn)分布式鎖:
Java分布式鎖看這篇就夠了 - seesun2012 - 博客園?
可以根據(jù)他在改變實現(xiàn)自己的分布式鎖。
第二種 使用 Apache 開源的curator 開實現(xiàn) Zookeeper 分布式鎖弄捕。