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

全國(guó)咨詢(xún)/投訴熱線(xiàn):400-618-4000

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

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

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

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

Synchronized中的重量級(jí)鎖,底層就是基于鎖監(jiān)視器(Monitor)來(lái)實(shí)現(xiàn)的。簡(jiǎn)單來(lái)說(shuō)就是鎖對(duì)象頭會(huì)指向一個(gè)鎖監(jiān)視器,而在監(jiān)視器中則會(huì)記錄一些信息,比如:

- _owner:持有鎖的線(xiàn)程

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

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

比如有三個(gè)線(xiàn)程來(lái)爭(zhēng)搶鎖資源,線(xiàn)程1獲取鎖成功,如圖所示:

單機(jī)鎖

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

分布式鎖

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

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

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

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

分布式鎖

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

那么該如何解決這個(gè)問(wèn)題呢?

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

分布式鎖

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

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

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

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

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

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

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

0 分享到:
和我們?cè)诰€(xiàn)交談!