用Zookeeper實現分佈式鎖其實就是創建一個臨時節點:如果臨時節點之前不存在,則臨時節點創建成功,則這把鎖屬於你了。
此時有其他人去創建同名的臨時節點,如果已經存在了,說明別人已經佔有了這把鎖,你就失敗了,這時候就對那個臨時節點註冊一個監聽器。當鎖被釋放的時候會通知你然後嘗試去創建。
其實釋放鎖就是刪除臨時節點,若刪除臨時節點,ZK會通知別人這個節點被刪除了,相當於鎖釋放了。然後就會嘗試再次創建這個臨時節點,若創建成功了,則說明獲得了鎖。
用臨時節點來實現分佈式鎖:加入創建該節點的客戶端掛掉了,則會自動刪除該節點,讓其它客戶端能獲取該鎖。
參考文檔:zk分佈式的實現。
redis 和 zk 分佈式鎖對比:redis 獲取鎖失敗時會反覆的嘗試,會造成性能的開銷。ZK會註冊監聽器監聽,假如鎖釋放掉了會通知。