分布式鎖

應用場景:

1.單體架構中利用Java本身的ReentrantLock 和 synchronized? ? 來做互斥鎖 。

2.在分布式系統(tǒng) 實現相同的功能時? 因為在多進程中運用分布式鎖

3.秒殺系統(tǒng)等實際應用場景


3.實現一個分布式鎖應該具備的特性:

高可用、高性能的獲取鎖與釋放鎖

在分布式系統(tǒng)環(huán)境下,一個方法或者變量同一時間只能被一個線程操作

具備鎖失效機制,網絡中斷或宕機無法釋放鎖時,鎖必須被刪除,防止死鎖

具備阻塞鎖特性,即沒有獲取到鎖,則繼續(xù)等待獲取鎖

具備非阻塞鎖特性,即沒有獲取到鎖,則直接返回獲取鎖失敗

具備可重入特性,一個線程中可以多次獲取同一把鎖,比如一個線程在執(zhí)行一個帶鎖的方法,該方法中又調用了另一個需要相同鎖的方法,則該線程可以直接執(zhí)行調用的方法,而無需重新獲得鎖


4.在之前的秒殺案例中,我們曾介紹過關于分布式鎖幾種實現方式:

基于數據庫實現分布式鎖

基于 Redis 實現分布式鎖

基于 Zookeeper 實現分布式鎖


5.首先用zookeeper 實現的分布式鎖

原理:zookeeper 內部 是分層的樹形結構的 文件系統(tǒng) 規(guī)定同一個目錄下面唯一的文件名 和 利用 臨時節(jié)點 和 wacth 機制 每個鎖占用一個普通節(jié)點/lock目錄下創(chuàng)建臨時節(jié)點,創(chuàng)建成功的話表示獲取鎖成功,失敗的的話 watch/lock節(jié)點,有刪除操作后再爭取鎖,臨時節(jié)點好處在于當進程掛掉了能自動上鎖的節(jié)點自動刪除 也就是取消鎖。

但是也有缺點。就是羊群效應? 也就是等待的節(jié)點 一同創(chuàng)建節(jié)點 并發(fā)量很大。

創(chuàng)建步驟:

1),創(chuàng)建一個目錄為lock的目錄

2),線程A獲取目錄下面的臨時節(jié)點

3),獲取該目錄下面的所有子節(jié)點,然后獲取比自己小的子節(jié)點,如果不存在,說明當前節(jié)點為最下節(jié)點,獲取鎖

4),線程B創(chuàng)建臨時節(jié)點并獲取所有兄弟節(jié)點,判斷自己的節(jié)點,設置監(jiān)聽比自己小的節(jié)點(防止羊群效應)

5),線程A處理完,刪除自己的節(jié)點,線程B監(jiān)聽到變更,判斷自己是最小節(jié)點,獲取鎖。


實現階段:

1,一般有兩種方法實現分布式鎖

第一種自己實現分布式鎖:

Java分布式鎖看這篇就夠了 - seesun2012 - 博客園?

可以根據他在改變實現自己的分布式鎖。

第二種 使用 Apache 開源的curator 開實現 Zookeeper 分布式鎖。

從構建分布式秒殺系統(tǒng)聊聊分布式鎖 - 柒's Blog

?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容