av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

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

瀏覽:78日期:2022-08-11 14:07:49

我們來(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)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 成人毛片在线 | 久久久久久久成人 | 欧美视频三区 | 欧美精品亚洲精品 | 超碰97免费 | 日韩中文字幕第一页 | 午夜免费小视频 | 五月婷婷深深爱 | 伊人影院综合 | 日韩在线中文字幕 | 欧美日韩在线精品 | 免费看黄色小视频 | 亚洲精品久久 | 国产又粗又猛视频免费 | 国产在线观看一区 | 日韩在线毛片 | 懂色av一区二区夜夜嗨 | 成人黄色av | 欧美日韩免费一区二区三区 | 天天色天天色 | 国产精品久久久一区二区 | 国产黄视频在线观看 | 一区二区免费 | 一区二区三区蜜桃 | 中国美女乱淫免费看视频 | 国产一级黄色录像 | 久久久久亚洲精品 | 国产在线视频一区 | 97人人视频 | 日日夜夜人人 | 欧美日韩国产三级 | 国产性生活视频 | 色综合色综合网色综合 | 久久精品二区 | 四虎av| 中文字幕国产 | 日韩手机在线视频 | www久久久久 | 黄色一及片| 国产精品成人网 | 国产又黄又爽视频 |