教育行業(yè)A股IPO第一股(股票代碼 003032)

全國咨詢/投訴熱線:400-618-4000

什么是分布式鎖?分布式鎖可以參考的方案

更新時間:2023年09月25日15時41分 來源:傳智教育 瀏覽次數(shù):

在多線程開發(fā)中,對共享資源的爭搶過程(Data Race)就是并發(fā),而對共享資源數(shù)據(jù)進行訪問保護的最直接辦法就是引入鎖。鎖的作用是解決在并發(fā)狀態(tài)下的共享資源互斥問題,保證在同一時間只有一個進程/線程可以掌握資源的控制權。

單機環(huán)境下,資源競爭者都是來自機器內部((進程/線程),那么實現(xiàn)鎖的方案只需要借助單機資源就可以了。

Synchronized中的重量級鎖,底層就是基于鎖監(jiān)視器(Monitor)來實現(xiàn)的。簡單來說就是鎖對象頭會指向一個鎖監(jiān)視器,而在監(jiān)視器中則會記錄一些信息,比如:

- _owner:持有鎖的線程

- _recursions:鎖重入次數(shù)

因此每一個鎖對象,都會指向一個鎖監(jiān)視器,而每一個鎖監(jiān)視器,同一時刻只能被一個線程持有,這樣就實現(xiàn)了互斥效果。但前提是,多個線程使用的是同一把鎖。

比如有三個線程來爭搶鎖資源,線程1獲取鎖成功,如圖所示:

單機鎖

此時其它線程想要獲取鎖,會發(fā)現(xiàn)監(jiān)視器中的_owner已經(jīng)有值了,就會獲取鎖失敗。

分布式鎖

分布式鎖是控制分布式系統(tǒng)之間同步訪問共享資源的一種方式。

分布式環(huán)境下會出現(xiàn)資源競爭的地方都需要分布式鎖的協(xié)調

分布式鎖的作用:在整個系統(tǒng)提供一個全局、唯一的鎖,在分布式系統(tǒng)中每個系統(tǒng)在進行相關操作的時候需要獲取到該鎖,才能執(zhí)行相應操作。

? 由于我們的服務將來肯定會以多實例形式部署,形成集群。每一個實例都會有一個自己的JVM運行環(huán)境,因此即便是同一個用戶,如果并發(fā)的發(fā)起了多個請求,由于請求進入了多個JVM,就會出現(xiàn)多個鎖對象(用戶id對象),自然就有多個鎖監(jiān)視器。此時就會出現(xiàn)每個JVM內部都有一個線程獲取鎖成功的情況,沒有達到互斥的效果,并發(fā)安全問題就可能再次發(fā)生了:

分布式鎖

可見,在集群環(huán)境下,JVM提供的傳統(tǒng)鎖機制就不再安全了。

那么該如何解決這個問題呢?

顯然,我們不能讓每個實例去使用各自的JVM內部鎖監(jiān)視器,而是應該在多個實例外部尋找一個鎖監(jiān)視器,多個實例爭搶同一把鎖。像這樣的鎖,就稱為分布式鎖。

分布式鎖

分布式鎖的實現(xiàn)方案

- 基于數(shù)據(jù)庫表

操作數(shù)據(jù)庫需要較大的開銷,性能差

- 基于緩存實現(xiàn)分布式鎖(redis)

- 基于Zookeeper實現(xiàn)分布式鎖

- 基于consul實現(xiàn)分布式鎖

- 基于etcd實現(xiàn)分布式鎖

0 分享到:
和我們在線交談!