为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 598 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号