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

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

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

我們來討論一個經(jīng)常存在的賬戶轉(zhuǎn)賬的問題。賬戶A要轉(zhuǎn)賬給賬戶B。為了保證在轉(zhuǎn)賬的過程中A和B不被其他的線程意外的操作,我們需要給A和B加鎖,然后再進行轉(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);
    }
}

看起來上面的程序好像沒有問題,因為我們給from和to都加了鎖,程序應該可以很完美的按照我們的要求來執(zhí)行。

那如果我們考慮下面的一個場景:

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

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

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

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

我們看下代碼實現(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來獲得兩個賬號的hash值,通過比較hash值的大小來選定lock的順序。

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

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

相關文章

  • springboot集成swagger過程解析

    springboot集成swagger過程解析

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

    Mybatis?批量更新實體對象方式

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

    Java BeanUtils.copyProperties的詳解

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

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

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

    springboot pojo對象日期屬性的問題

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

    Zookeeper?Curator使用介紹

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

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

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

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

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

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

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

    Java中csv文件讀寫超詳細分析

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

最新評論

东阳市| 丹棱县| 特克斯县| 昔阳县| 甘南县| 新乡县| 高青县| 四会市| 梁山县| 玉环县| 南雄市| 金山区| 彝良县| 南平市| 西盟| 长白| 靖州| 瑞昌市| 娱乐| 广东省| 临颍县| 滨海县| 宝鸡市| 颍上县| 浠水县| 三门峡市| 龙井市| 长治市| 无锡市| 绩溪县| 顺义区| 略阳县| 武定县| 台东县| 云阳县| 濮阳市| 樟树市| 芮城县| 信阳市| 盘锦市| 南陵县|