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

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

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

我們來(lái)討論一個(gè)經(jīng)常存在的賬戶轉(zhuǎn)賬的問(wèn)題。賬戶A要轉(zhuǎn)賬給賬戶B。為了保證在轉(zhuǎn)賬的過(guò)程中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);
    }
}

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

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

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

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

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

加入不管參數(shù)怎么傳遞,我們都先lock accountA再lock accountB是不是就不會(huì)出現(xiàn)死鎖的問(wè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來(lái)獲得兩個(gè)賬號(hào)的hash值,通過(guò)比較hash值的大小來(lái)選定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)文章

  • springboot集成swagger過(guò)程解析

    springboot集成swagger過(guò)程解析

    這篇文章主要介紹了springboot集成swagger過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-01-01
  • Mybatis?批量更新實(shí)體對(duì)象方式

    Mybatis?批量更新實(shí)體對(duì)象方式

    這篇文章主要介紹了Mybatis?批量更新實(shí)體對(duì)象方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Java BeanUtils.copyProperties的詳解

    Java BeanUtils.copyProperties的詳解

    這篇文章主要介紹了Java BeanUtils.copyProperties的詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • Java與Android使用監(jiān)聽(tīng)者模式示例

    Java與Android使用監(jiān)聽(tīng)者模式示例

    這篇文章主要為大家介紹了Java與Android使用監(jiān)聽(tīng)者模式示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08
  • springboot pojo對(duì)象日期屬性的問(wèn)題

    springboot pojo對(duì)象日期屬性的問(wèn)題

    這篇文章主要介紹了springboot pojo對(duì)象日期屬性的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • Zookeeper?Curator使用介紹

    Zookeeper?Curator使用介紹

    curator是Net?ix公司開(kāi)源的?套Zookeeper客戶端框架,和ZKClient?樣,Curator解決了很多Zookeeper客戶端非常底層的細(xì)節(jié)開(kāi)發(fā)?作,包括連接重連,反復(fù)注冊(cè)Watcher和NodeExistsException異常等,是最流行的Zookeeper客戶端之?
    2022-09-09
  • Java運(yùn)算符>、>>、>>>三者的區(qū)別

    Java運(yùn)算符>、>>、>>>三者的區(qū)別

    這篇文章主要介紹了Java運(yùn)算符>、>>、>>>三者的區(qū)別,做了一個(gè)簡(jiǎn)單的對(duì)比,并用實(shí)例說(shuō)明,需要的朋友可以參考下
    2014-06-06
  • Java中NoClassDefFoundError?和?ClassNotFoundException的區(qū)別

    Java中NoClassDefFoundError?和?ClassNotFoundException的區(qū)別

    Java中NoClassDefFoundError和ClassNotFoundException的區(qū)別,從類繼承層次上來(lái)看,ClassNotFoundException是從Exception繼承的,所以ClassNotFoundException是一個(gè)檢查異常。具體詳情需要的朋友可以參考下面文章內(nèi)容
    2022-06-06
  • 使用Mybatis遇到的坑之Integer類型參數(shù)的解讀

    使用Mybatis遇到的坑之Integer類型參數(shù)的解讀

    這篇文章主要介紹了使用Mybatis遇到的坑之Integer類型參數(shù)的解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Java中csv文件讀寫(xiě)超詳細(xì)分析

    Java中csv文件讀寫(xiě)超詳細(xì)分析

    CSV是一種通用的、相對(duì)簡(jiǎn)單的文件格式,其文件以純文本形式存儲(chǔ)表格數(shù)據(jù),下面這篇文章主要給大家介紹了關(guān)于Java中csv文件讀寫(xiě)分析的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-05-05

最新評(píng)論

色达县| 肥东县| 和硕县| 区。| 成武县| 香河县| 当阳市| 古交市| 马鞍山市| 普安县| 和政县| 凌源市| 进贤县| 铅山县| 无棣县| 涡阳县| 金门县| 繁昌县| 准格尔旗| 额尔古纳市| 永福县| 聂拉木县| 前郭尔| 和田市| 洛南县| 博野县| 洪洞县| 莫力| 灵武市| 建湖县| 东台市| 西青区| 拉萨市| 罗平县| 灌南县| 合作市| 修水县| 历史| 施秉县| 嘉善县| 瓮安县|