亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

打破同步塊?

打破同步塊?

米脂 2022-06-15 09:47:01
我有這個:synchronized(c){   if (!items.hasNext() && (c.getFinishedCount() == c.getStartedCount())) {      f.done(null, results);      return;    }    if(c.isBelowCapacity()){      RunMap(items,m,results,c,s,f);    }}但最終當我調用RunMap()orf.done()時我不需要在 c 上同步,我只需要在執行條件檢查 / if 語句時在 c 上同步。我應該只使 c 上的方法同步,然后擺脫同步塊嗎?
查看完整描述

2 回答

?
眼眸繁星

TA貢獻1873條經驗 獲得超9個贊

我應該只使 c 上的方法同步,然后擺脫同步塊嗎?


不,更好的方法是在同步塊中進行檢查,然后再做剩下的工作:


boolean bFDone = false;

boolean bRunMap = false;


synchronized (c) {

    bFDone = !items.hasNext() && (c.getFinishedCount() == c.getStartedCount());

    bRunMap = !bFDone && c.isBelowCapacity();

}


if (bFDone) {

    f.done(null, results);

} else if (bRunMap) {

    RunMap(items,m,results,c,s,f);

}

這個版本的最大優勢是,所有易失性代碼實際上都是同步的,其余(可能很慢)的東西會在以后發生。


正如在這個答案的評論中正確提到的那樣,如果您的初始假設是正確的,那么這只會正常工作,即整個塊不需要同步。如果您需要立即對條件做出反應,那么該塊實際上需要(完全)同步。


查看完整回答
反對 回復 2022-06-15
?
www說

TA貢獻1775條經驗 獲得超8個贊

使c的方法同步可能是個壞主意。首先,這意味著無論何時調用它們,無論上下文如何,它們都會同步,這可能不是您的意思。其次,它無助于原子地解決條件!items.hasNext()和c.getFinishedCount() == c.getStartedCount().


一種選擇是初始化塊boolean內的變量synchronized,然后在它們之外執行相關調用:


final boolean isDone;

synchronized(c) {

    isDone = !items.hasNext() && (c.getFinishedCount() == c.getStartedCount());

}


if (isDone) {

    f.done(null, results);

    return;

}


final boolean isBelowCapacity;

synchronized(c) {

    isBelowCapacity =  c.isBelowCapacity();

}


if (isBelowCapacity) {

    RunMap(items,m,results,c,s,f);

}


查看完整回答
反對 回復 2022-06-15
  • 2 回答
  • 0 關注
  • 107 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號