您好,登錄后才能下訂單哦!
這篇文章主要介紹了Java如何實現ZooKeeper分布式鎖,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。
1、在我們進行單機應用開發,涉及并發同步的時候,我們往往采用synchronized或者Lock的方式來解決多線程間的代碼同步問題,這時多線程的運行都是在同一個JVM之下,沒有任何問題。
2、但當我們的應用是分布式集群工作的情況下,屬于多JVM下的工作環境(多臺機器),跨JVM之間已經無法通過多線程的鎖解決同步問題。那么就需要一種更加高級的鎖機制,來處理種跨機器的進程之間的數據同步問題——這就是分布式鎖。(多節點從分布式組件中獲取鎖)
例如以下實例:
各種搶票軟件客戶端通過zookeeper獲取鎖,最終只有一個客戶端可以獲得鎖并且先與12306服務器進行數據通信,最終和12306數據庫服務器通行。通信完畢之后釋放鎖,其他客戶端獲取鎖之后執行同樣的操作。(顯然前提是這幾個客戶端都通過負載均衡后均與節點集群中同一個服務器進行通信)
3、其他分布式鎖
核心思想:當客戶端要獲取鎖,則創建節點,使用完鎖,則刪除該節點。
1、客戶端獲取鎖時,在lock節點下創建臨時順序節點。
2、然后獲取lock下面的所有子節點,客戶端獲取到所有的子節點之后,如果發現自己創建的子節點序號最小,那么就認為該客戶端獲取到了鎖。使用完鎖后,將該節點刪除。
注意:
創建臨時節點的原因:
如果某個已經獲取鎖了的節點發生宕機,如果是持久化節點,那么鎖就無法釋放。如果是臨時節點,在發生宕機后,連接斷開會自動釋放鎖。
創建順序節點的原因:
將節點按順序編號,客戶端通過節點編號判斷自己是否是序號最小的節點,并且獲得鎖。
3、如果發現自己創建的節點并非lock所有子節點中最小的,說明自己還沒有獲取到鎖,此時客戶端需要找到比自己小的那個節點,同時對其注冊事件監聽器,監聽刪除事件。
4、如果發現比自己小的那個節點被刪除,則客戶端的 Watcher會收到相應通知,此時再次判斷自己創建的節點是否是lock子節點中序號最小的,如果是則獲取到了鎖, 如果不是則重復以上步驟繼續獲取到比自己小的一個節點并注冊監聽。
感謝你能夠認真閱讀完這篇文章,希望小編分享的“Java如何實現ZooKeeper分布式鎖”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。