為什么要有分布式鎖?
比如說,我們要下單,分為兩個操作,下單成功(訂單服務),扣減庫存(商品服務)。如果沒有鎖的話,同時兩個請求進來。先檢查有沒有庫存,一看都有,然后下訂單,減庫存。這時候肯定會出現錯誤。我們想要的結果是。只有一個請求可以進來。當完成這個操作之后,下一個請求再進來。這才不會出現庫存賣超的現象。這時候,就需要我們使用分布式鎖來實現。
實現分布式鎖的方法有很多種。redis,zk都可以。但是還是推薦zk。
先說下大體思路:
首先,我們在下單的時候,先獲取鎖。如果獲取成功,就進行我們下面的業務處理。處理完之后。釋放鎖。然后其他請求如果也請求,同樣會先獲取鎖,當然獲取不到,所以就掛起,當別人釋放以后,然后再重新嘗試獲取鎖。
具體是如何獲取鎖?
主要通過zk來創建一個節點實現,就是說,剛開始沒有這個節點,說明沒有人獲取鎖,然后你創建了這個節點,說明你獲取到了這個鎖。記住,這個節點一定要是臨時節點。
然后,當然獲取鎖這個操作是一個死循環。通過一個靜態變量CountDownLatch 來控制。如果CountDownLatch 大於0 就wait掛起,當別人釋放之后,另繼續循環,嘗試獲取鎖。
釋放鎖就是說吧這個節點刪除。CountDownLatch 重新置為1。
代碼有空填上!!!!先占坑