ZooKeeper是一個分布式的,開放源碼的分布式應用程式協調服務。基于ZooKeeper,我們可以實作一種簡單的分布式互斥鎖,包括可重入與不可重入。代碼如下:
運作結果如下:
示例可能略顯粗糙,但是大體原理就是這樣。我們可以利用ZooKeeper上一個固定位置的節點有無,來判斷鎖是否被擷取到。當某一線程來臨時,如果節點不存在,則說明沒有其他線程占用對應鎖,調用ZooKeeper的create()方法建立節點,辨別分布式鎖已被目前線程占用。待業務處理完畢後,再調用ZooKeeper的delete()方法删除節點,則完成鎖的釋放。
同時,我們可以對應節點寫入線程名等區分線程唯一性的字段來辨別鎖被哪個線程占用。而當再有線程要擷取鎖時,如果為不可重入鎖,無論哪個線程,即便是持有鎖的線程本身,也得等鎖釋放後再擷取鎖,如果為可重入鎖,則判斷目前線程唯一性字段與對應節點中的資料是否一緻即可。
當然,也可以利用ZooKeeper的CreateMode中PERSISTENT_SEQUENTIAL,一種順序自動編号的目錄節點,檢測某節點的子目錄,來實作可以排隊的優先級鎖!這個留待以後我們再研究!