欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談Java由于不當(dāng)?shù)膱?zhí)行順序?qū)е碌乃梨i

 更新時(shí)間:2021年06月01日 12:55:16   作者:flydean  
為了保證線程的安全,我們引入了加鎖機(jī)制,但是如果不加限制的使用加鎖,就有可能會(huì)導(dǎo)致順序死鎖(Lock-Ordering Deadlock)。本文將會(huì)討論一下順序死鎖的問題。

我們來討論一個(gè)經(jīng)常存在的賬戶轉(zhuǎn)賬的問題。賬戶A要轉(zhuǎn)賬給賬戶B。為了保證在轉(zhuǎn)賬的過程中A和B不被其他的線程意外的操作,我們需要給A和B加鎖,然后再進(jìn)行轉(zhuǎn)賬操作, 我們看下轉(zhuǎn)賬的代碼:

public void transferMoneyDeadLock(Account from,Account to, int amount) throws InsufficientAmountException {
    synchronized (from){
        synchronized (to){
            transfer(from,to,amount);
        }
    }
}

private void transfer(Account from,Account to, int amount) throws InsufficientAmountException {
    if(from.getBalance() < amount){
        throw new InsufficientAmountException();
    }else{
        from.debit(amount);
        to.credit(amount);
    }
}

看起來上面的程序好像沒有問題,因?yàn)槲覀兘ofrom和to都加了鎖,程序應(yīng)該可以很完美的按照我們的要求來執(zhí)行。

那如果我們考慮下面的一個(gè)場(chǎng)景:

A:transferMoneyDeadLock(accountA, accountB, 20)
B:transferMoneyDeadLock(accountB, accountA, 10)

如果A和B同時(shí)執(zhí)行,則可能會(huì)產(chǎn)生A獲得了accountA的鎖,而B獲得了accountB的鎖。從而后面的代碼無法繼續(xù)執(zhí)行,從而導(dǎo)致了死鎖。

對(duì)于這樣的情況,我們有沒有什么好辦法來處理呢?

加入不管參數(shù)怎么傳遞,我們都先lock accountA再lock accountB是不是就不會(huì)出現(xiàn)死鎖的問題了呢?

我們看下代碼實(shí)現(xiàn):

private void transfer(Account from,Account to, int amount) throws InsufficientAmountException {
    if(from.getBalance() < amount){
        throw new InsufficientAmountException();
    }else{
        from.debit(amount);
        to.credit(amount);
    }
}

public void transferMoney(Account from,Account to, int amount) throws InsufficientAmountException {

    int fromHash= System.identityHashCode(from);
    int toHash = System.identityHashCode(to);

    if(fromHash < toHash){
        synchronized (from){
            synchronized (to){
                transfer(from,to, amount);
            }
        }
    }else if(fromHash < toHash){
        synchronized (to){
            synchronized (from){
                transfer(from,to, amount);
            }
        }
    }else{
        synchronized (lock){
        synchronized (from) {
            synchronized (to) {
                transfer(from, to, amount);
            }
            }
        }
    }
}

上面的例子中,我們使用了System.identityHashCode來獲得兩個(gè)賬號(hào)的hash值,通過比較hash值的大小來選定lock的順序。

如果兩個(gè)賬號(hào)的hash值恰好相等的情況下,我們引入了一個(gè)新的外部lock,從而保證同一時(shí)間只有一個(gè)線程能夠運(yùn)行內(nèi)部的方法,從而保證了任務(wù)的執(zhí)行而不產(chǎn)生死鎖。

以上就是淺談Java由于不當(dāng)?shù)膱?zhí)行順序?qū)е碌乃梨i的詳細(xì)內(nèi)容,更多關(guān)于Java由于不當(dāng)?shù)膱?zhí)行順序?qū)е碌乃梨i的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 使用redisTemplate的scan方式刪除批量key問題

    使用redisTemplate的scan方式刪除批量key問題

    這篇文章主要介紹了使用redisTemplate的scan方式刪除批量key問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-12-12
  • 使用Prometheus+Grafana的方法監(jiān)控Springboot應(yīng)用教程詳解

    使用Prometheus+Grafana的方法監(jiān)控Springboot應(yīng)用教程詳解

    這篇文章主要介紹了用Prometheus+Grafana的方法監(jiān)控Springboot應(yīng)用,本文通過實(shí)例代碼詳解給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Spring Boot超詳細(xì)講解請(qǐng)求處理流程機(jī)制

    Spring Boot超詳細(xì)講解請(qǐng)求處理流程機(jī)制

    SpringBoot是一種整合Spring技術(shù)棧的方式(或者說是框架),同時(shí)也是簡(jiǎn)化Spring的一種快速開發(fā)的腳手架,本篇讓我們一起分析請(qǐng)求處理流程機(jī)制
    2022-07-07
  • JDBC獲取元數(shù)據(jù)demo

    JDBC獲取元數(shù)據(jù)demo

    這篇文章主要為大家介紹了JDBC獲取元數(shù)據(jù)實(shí)現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-11-11
  • SpringBoot集成Spring Security的方法

    SpringBoot集成Spring Security的方法

    Spring security,是一個(gè)強(qiáng)大的和高度可定制的身份驗(yàn)證和訪問控制框架。這篇文章主要介紹了SpringBoot集成Spring Security的操作方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-07-07
  • jstl EL表達(dá)式遍歷Map的方法

    jstl EL表達(dá)式遍歷Map的方法

    這篇文章主要介紹了jstl EL表達(dá)式遍歷Map的方法的相關(guān)資料,需要的朋友可以參考下
    2016-12-12
  • java繪制哆啦A夢(mèng) 超可愛

    java繪制哆啦A夢(mèng) 超可愛

    這篇文章主要介紹了java繪制哆啦A夢(mèng),特別的可愛,文中示例代碼介紹的也非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • 智能 AI 代碼生成工具 Cursor 安裝和使用超詳細(xì)教程

    智能 AI 代碼生成工具 Cursor 安裝和使用超詳細(xì)教程

    Cursor.so 是一個(gè)集成了 GPT-4 的國(guó)內(nèi)直接可以訪問的,優(yōu)秀而強(qiáng)大的免費(fèi)代碼生成器,可以幫助你快速編寫、編輯和討論代碼,這篇文章主要介紹了智能 AI 代碼生成工具 Cursor 安裝和使用介紹,需要的朋友可以參考下
    2023-05-05
  • SpringBoot小程序推送信息的項(xiàng)目實(shí)踐

    SpringBoot小程序推送信息的項(xiàng)目實(shí)踐

    本文主要介紹了SpringBoot小程序推送信息的項(xiàng)目實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04
  • 基于Java的界面開發(fā)詳細(xì)步驟(用戶注冊(cè)登錄)

    基于Java的界面開發(fā)詳細(xì)步驟(用戶注冊(cè)登錄)

    通過一段時(shí)間Java Web的學(xué)習(xí),寫一個(gè)簡(jiǎn)單的注冊(cè)登陸界面來做個(gè)總結(jié),這篇文章主要給大家介紹了基于Java的界面開發(fā)(用戶注冊(cè)登錄)的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-01-01

最新評(píng)論