最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java之分布式鎖的5種實(shí)現(xiàn)過(guò)程

 更新時(shí)間:2025年09月13日 09:19:02   作者:右手嘚溫暖  
這篇文章主要介紹了Java之分布式鎖的5種實(shí)現(xiàn)過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

1、分布式鎖的基本概念

分布式鎖是在分布式系統(tǒng)環(huán)境下,控制多個(gè)進(jìn)程/服務(wù)/主機(jī)互斥訪問(wèn)共享資源的核心協(xié)調(diào)機(jī)制。

它解決了單機(jī)鎖(如Java的synchronized、ReentrantLock)在分布式場(chǎng)景下失效的問(wèn)題,是構(gòu)建可靠分布式應(yīng)用的必備工具。

解決我們?cè)诙鄠€(gè)jvm中最終只能有一個(gè)jvm執(zhí)行,從而保證了冪等性的問(wèn)題。

2、業(yè)務(wù)超時(shí),一直不釋放鎖如何處理?

可以采用續(xù)命設(shè)計(jì),續(xù)命多次,如果業(yè)務(wù)還是沒(méi)有執(zhí)行完畢,則認(rèn)為超時(shí),應(yīng)該主動(dòng)釋放該鎖,防止其他jvm一直阻塞等待。

  • (1)主動(dòng)釋放鎖;
  • (2)回滾當(dāng)前業(yè)務(wù)邏輯;
  • (3)主動(dòng)停止該線程;
  • (4)移除監(jiān)聽。

3、集群環(huán)境中保證定時(shí)任務(wù)執(zhí)行的冪等性問(wèn)題

冪等性:

  • 執(zhí)行結(jié)果保證唯一不能夠重復(fù)。
  • 當(dāng)我們定時(shí)任務(wù)服務(wù)集群的情況下,有可能會(huì)同時(shí)重復(fù)執(zhí)行定時(shí)任務(wù)

解決思路:

  • 多個(gè)jvm集群的定時(shí)任務(wù),在觸發(fā)的時(shí)候,獲取分布式鎖,
  • 如果能夠獲取到分布式鎖的jvm,就能夠執(zhí)行定時(shí)任務(wù),沒(méi)有獲取到的就不能執(zhí)行定時(shí)任務(wù)。

4、基于zookeeper實(shí)現(xiàn)分布式鎖

(1)實(shí)現(xiàn)分布式鎖思路:

因?yàn)閆ookeeper節(jié)點(diǎn)路徑保持唯一,不允許重復(fù),且有臨時(shí)節(jié)點(diǎn)特性,連接關(guān)閉后當(dāng)前節(jié)點(diǎn)會(huì)自動(dòng)消失,從而實(shí)現(xiàn)分布式鎖。

(2)實(shí)現(xiàn)原理:(臨時(shí)節(jié)點(diǎn)+事件通知)

  • 多個(gè)jvm請(qǐng)求同時(shí)創(chuàng)建相同的臨時(shí)節(jié)點(diǎn)(lockPath),只要誰(shuí)能夠創(chuàng)建成功誰(shuí)就能夠獲取到鎖;
  • 如果創(chuàng)建節(jié)點(diǎn)的時(shí)候,突然該節(jié)點(diǎn)已經(jīng)被其他請(qǐng)求創(chuàng)建的話則直接等待;
  • 只要能夠創(chuàng)建節(jié)點(diǎn)成功,則開始進(jìn)入到正常業(yè)務(wù)邏輯操作,其他沒(méi)有獲取到鎖的jvm進(jìn)行等待;
  • 正常業(yè)務(wù)邏輯流程執(zhí)行完后,調(diào)用zk關(guān)閉連接方式釋放鎖,從而使其他的請(qǐng)求開始進(jìn)入到獲取鎖的資源。

疑問(wèn):如果使用zk實(shí)現(xiàn)分布式鎖,獲取鎖之后業(yè)務(wù)邏輯方法一直沒(méi)有執(zhí)行完畢,導(dǎo)致其他所有的請(qǐng)求等待的話如何解決?

設(shè)置Session連接超時(shí)時(shí)間,在規(guī)定的時(shí)間內(nèi)獲取鎖后超時(shí)啦~自動(dòng)回滾當(dāng)前數(shù)據(jù)庫(kù)業(yè)務(wù)邏輯。

5、基于數(shù)據(jù)庫(kù)實(shí)現(xiàn)分布式鎖

(1)悲觀鎖

  • 就是先select…forupdate鎖住主鍵key_resource那個(gè)記錄,如果為空,則可以插入一條記錄,如果已有記錄判斷下狀態(tài)和時(shí)間,是否已經(jīng)超時(shí)。
  • 這里需要注意一下哈,必須要加事務(wù)哈。

(2)搞個(gè)version字段

  • 每次更新修改,都會(huì)自增加一,然后去更新余額時(shí),把查出來(lái)的那個(gè)版本號(hào),帶上條件去更新,
  • 如果是上次那個(gè)版本號(hào),就更新,如果不是,表示別人并發(fā)修改過(guò)了,就繼續(xù)重試。)

6、基于redis實(shí)現(xiàn)分布式鎖

(1)采用Setnx

Redis中SetnX與Set命令的區(qū)別

  • Setnx可以返回該key是否存在,存在返回0,不存在返回1,如果該key存在的情況下,是不能做修改的。
  • Set每次直接覆蓋該key對(duì)應(yīng)的value。

獲取鎖的原理:

  • 多個(gè)redis客戶端執(zhí)行setNx命令,設(shè)置一個(gè)相同的redis的key,誰(shuí)能創(chuàng)建key成功,誰(shuí)就能獲取鎖,
  • 如果該key已經(jīng)存在的情況下,則再創(chuàng)建的時(shí)候會(huì)返回false。

釋放鎖的原理:

  • 刪除該key。

7、基于redisson實(shí)現(xiàn)分布式鎖

多個(gè)jvm同時(shí)在redis中寫入一個(gè)相同的key,誰(shuí)能夠?qū)懭氤晒?,誰(shuí)就能獲取到鎖。

(1)向redis中寫入key的時(shí)候使用lua腳本,不是setNx;

(2)如果寫入key成功,會(huì)單獨(dú)開啟一個(gè)看門狗線程(續(xù)命定時(shí)任務(wù)線程),默認(rèn)的情況下每隔10s時(shí)間不斷續(xù)命延遲。

(3)一直不斷實(shí)現(xiàn)續(xù)命的情況下,也會(huì)發(fā)生死鎖問(wèn)題,此時(shí)設(shè)定續(xù)命的次數(shù),續(xù)命多次如果業(yè)務(wù)邏輯還沒(méi)有執(zhí)行完畢,主動(dòng)回滾當(dāng)前的mysql事務(wù),并釋放該鎖。

8、基于Curator實(shí)現(xiàn)分布式鎖(解決羊群效應(yīng)問(wèn)題)

核心思想:

(1)從緩存中查找是否已經(jīng)創(chuàng)建分布式鎖,如果已經(jīng)創(chuàng)建了分布式鎖,則直接復(fù)用(具有可重入性)。

(2)如果緩存中沒(méi)有,則創(chuàng)建一個(gè)分布式鎖。

(3)實(shí)現(xiàn)原理:創(chuàng)建一個(gè)臨時(shí)節(jié)點(diǎn),獲取當(dāng)前父節(jié)點(diǎn)下的子節(jié)點(diǎn),如果是為最小的節(jié)點(diǎn),則表示獲取鎖成功,否則獲取鎖失敗,阻塞等待,則監(jiān)聽上一個(gè)節(jié)點(diǎn)。

(4)當(dāng)上一個(gè)節(jié)點(diǎn)如果釋放鎖之后,直接進(jìn)入到獲取鎖的狀態(tài),喚醒使用waitnotify技術(shù)。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Spring RedirectAttributes參數(shù)跳轉(zhuǎn)代碼實(shí)例

    Spring RedirectAttributes參數(shù)跳轉(zhuǎn)代碼實(shí)例

    這篇文章主要介紹了Spring RedirectAttributes參數(shù)跳轉(zhuǎn)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • SpringBoot啟動(dòng)流程之引導(dǎo)上下文DefaultBootstrapContext的過(guò)程

    SpringBoot啟動(dòng)流程之引導(dǎo)上下文DefaultBootstrapContext的過(guò)程

    本文詳細(xì)介紹了SpringBoot版本2.7.18中SpringApplication的run方法,引導(dǎo)注冊(cè)組件初始化器BootstrapRegistryInitializer是SpringBoot的第一個(gè)擴(kuò)展點(diǎn),負(fù)責(zé)應(yīng)用啟動(dòng)早期階段的初始化和配置,感興趣的朋友跟隨小編一起看看吧
    2024-11-11
  • Java getParameter方法案例詳解

    Java getParameter方法案例詳解

    這篇文章主要介紹了Java getParameter方法案例詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)原理解析

    JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)原理解析

    這篇文章主要介紹了JVM運(yùn)行時(shí)數(shù)據(jù)區(qū)原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • java網(wǎng)絡(luò)爬蟲連接超時(shí)解決實(shí)例代碼

    java網(wǎng)絡(luò)爬蟲連接超時(shí)解決實(shí)例代碼

    這篇文章主要介紹了java網(wǎng)絡(luò)爬蟲連接超時(shí)解決的問(wèn)題,分享了一則使用httpclient解決連接超時(shí)的Java爬蟲實(shí)例代碼,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • java實(shí)現(xiàn)畫圖板功能

    java實(shí)現(xiàn)畫圖板功能

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)畫圖板功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-09-09
  • spring boot整合Swagger2的示例代碼

    spring boot整合Swagger2的示例代碼

    Swagger 是一個(gè)規(guī)范和完整的框架,用于生成、描述、調(diào)用和可視化RESTful風(fēng)格的 Web 服務(wù)。這篇文章主要介紹了spring boot整合Swagger2,需要的朋友可以參考下
    2017-04-04
  • 教你在SpringBoot中管理多環(huán)境配置文件

    教你在SpringBoot中管理多環(huán)境配置文件

    在項(xiàng)目開發(fā)中,一般會(huì)分為開發(fā)環(huán)境,測(cè)試環(huán)境和生產(chǎn)環(huán)境.如果總是在一個(gè)文件中修修改改,難免會(huì)出現(xiàn)錯(cuò)誤,尤其是在交接的過(guò)程中,一旦出現(xiàn)問(wèn)題,輕則丟失績(jī)效,重則需要?jiǎng)h庫(kù)跑路.本文則帶大家詳細(xì)了解怎么管理多環(huán)境配置文件,需要的朋友可以參考下
    2021-05-05
  • 解析阿里一面CyclicBarrier和CountDownLatch的區(qū)別

    解析阿里一面CyclicBarrier和CountDownLatch的區(qū)別

    這篇文章主要介紹了阿里一面CyclicBarrier和CountDownLatch的區(qū)別是啥,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03
  • Rxjava+Retrofit+MVP實(shí)現(xiàn)購(gòu)物車功能

    Rxjava+Retrofit+MVP實(shí)現(xiàn)購(gòu)物車功能

    這篇文章主要為大家詳細(xì)介紹了Rxjava+Retrofit+MVP實(shí)現(xiàn)購(gòu)物車功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-05-05

最新評(píng)論

板桥市| 莱芜市| 绿春县| 曲松县| 威海市| 庆云县| 东兰县| 安康市| 泽普县| 治多县| 惠水县| 五指山市| 邛崃市| 南岸区| 浦城县| 睢宁县| 什邡市| 卓资县| 清水河县| 德清县| 本溪| 福海县| 武威市| 庆城县| 乌拉特后旗| 永康市| 东阳市| 苍梧县| 九江县| 囊谦县| 伊金霍洛旗| 兴安县| 松阳县| 靖远县| 平远县| 尚义县| 筠连县| 麻栗坡县| 富裕县| 利津县| 宜良县|