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

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

java 多線程

java 多線程

江戶川亂折騰 2019-03-29 23:14:06
以下代碼高并發時會有啥問題,怎么優化
查看完整描述

6 回答

?
動漫人物

TA貢獻1815條經驗 獲得超10個贊

1、用了synchronized修飾了方法,又用synchronized修飾方法體,這兩者是等效的,都是獲得this(MyStack)的對象監視器并且臨界區也是一致的,同是因為synchronized是可重入的,所以你這樣用不會發生錯誤,但是這是不必要的;

2、可能會發生 @房管局規劃部 中出現的錯誤,wait()可能出現假喚醒,而不滿足臨界條件,后續邏輯就會異常。
可以參看jdk wait()方法的注釋描述:
https://img1.sycdn.imooc.com//5cb839df0001310c05460466.jpg

所以,應該是這樣:

synchronized( method_or_shared_object){

    while(list.size()<=0)

        wait();

    // pop something...

}

一般來說,都需要在while(condition) wait()來防止假喚醒。


查看完整回答
反對 回復 2019-04-18
?
楊魅力

TA貢獻1811條經驗 獲得超6個贊

這段代碼在高并發的情況下會出現鎖競爭激烈,性能低下的問題。其它的死鎖什么的不會出現,不要想太多了。高并發場景建議用concurrent linked queue,分段加鎖,能降低鎖競爭


查看完整回答
反對 回復 2019-04-18
?
一只斗牛犬

TA貢獻1784條經驗 獲得超2個贊

list變量每個線程進來都會new一個新的吧


查看完整回答
反對 回復 2019-04-18
?
千萬里不及你

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

首先synchronized修飾方法的問題


對于非static方法,其作用相當于synchronized(this):

synchronized void method(){


// method body

}

// 等價于

void method() {


   synchronized(this){

       // method body

   }

}


對于static方法,其相當于synchronized(YourClass.class):

class YourClass {


   synchronized static void method() {

       // method body

   }

   // 等價于

   static void method() {

       synchronized(YourClass.class) {

           // method body

       }

   }

}


其次關于假喚醒問題,就是@spance說的。官方docde描述是:


A thread can also wake up without being notified, interrupted, or timing out, a so-called spurious wakeup.


官方給出的解決方案是:


synchronized (obj) {

     while (<condition does not hold>)

         obj.wait();

     ... // Perform action appropriate to condition

  }

The doc

查看完整回答
反對 回復 2019-04-18
  • 6 回答
  • 0 關注
  • 619 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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