讀鎖和寫鎖
讀鎖: 是共享鎖,讀鎖與讀鎖是可以兼容的,所以同時有多個請求都可以持有
寫鎖: 是獨占鎖,寫鎖與任何鎖都互斥,所以只有一個請求持有,這個請求釋放寫鎖其他請求才能持有
一旦持有寫鎖,說明數據在發送變化就不能讀了,自然一個請求就不能出現讀鎖和寫鎖共存的情況
總結: 讀鎖與讀鎖之間兼容,其他都是互斥
讀寫鎖的實現邏輯轉換如下
讀鎖: 請求要判斷是否可以持有共享資源的讀鎖,需要判斷之前是否有請求持有這個共享資源的寫鎖
寫鎖: 請求要判斷是否可以持有寫鎖,需要判斷是否有請求持有這個共享資源的讀鎖或者寫鎖,就是沒有請求持有這個共享資源的任何的鎖
zookeeper區分分布式鎖
區分是那個共享資源的鎖,是通過zookeeper路徑來區分的
區分一個共享資源是讀鎖還是寫鎖這種鎖的類型,是通過zookeeper節點名的前綴來區分的
zookeeper實現分布式寫鎖
1、請求過來的時候都會創建一個臨時序號節點
2、獲取zookeeper中所有的臨時序號節點
3、判斷自己是否是最小的節點
????????如果是,說明在這個請求之前是沒有其他請求獲取并持有這個共享資源的讀鎖或者寫鎖,目前共享資源訪問的第一個請求,我可以獲取并持有這個共享資源的寫鎖
????????如果不是,說明已經有請求在我之前獲取并持有這個共享資源的寫鎖或者讀鎖了,前面有請求獲取到寫鎖或者讀鎖,我都互斥,自然就獲取寫鎖失敗
? ? ? ? 獲取鎖失敗之后,監聽最小的臨時序號節點,如果最小的臨時序號節點出現變化,則回到第二步進行執行
zookeeper實現分布式讀鎖
1、請求過來的時候都會創建一個臨時序號節點
2、獲取到zookeeper中比自己序號小的所有臨時節點
3、判斷最小節點是否為讀鎖(根據寫鎖的實現原理可知,如果寫鎖存在,必然是最小臨時序號節點)
? ? ? ? 如果是讀鎖,說明這個共享資源目前沒有請求持有寫鎖,直接獲取并持有讀鎖
????????如果不是讀鎖,說明目前第一個請求持有寫鎖,讀鎖寫鎖互斥,獲取并持有讀鎖失敗
????????獲取讀鎖失敗之后,監聽最小的臨時序號節點,如果最小的臨時序號節點出現變化,則回到第二步進行執行
? ? ? ??