java 多线程

以下代码高并发时会有啥问题,怎么优化

https://img.mukewang.com/5cb839d10001e38d08000476.jpg


江户川乱折腾
浏览 599回答 6
6回答

动漫人物

1、用了synchronized修饰了方法,又用synchronized修饰方法体,这两者是等效的,都是获得this(MyStack)的对象监视器并且临界区也是一致的,同是因为synchronized是可重入的,所以你这样用不会发生错误,但是这是不必要的;2、可能会发生&nbsp;@房管局规划部&nbsp;中出现的错误,wait()可能出现假唤醒,而不满足临界条件,后续逻辑就会异常。可以参看jdk wait()方法的注释描述:所以,应该是这样:synchronized( method_or_shared_object){&nbsp; &nbsp; while(list.size()<=0)&nbsp; &nbsp; &nbsp; &nbsp; wait();&nbsp; &nbsp; // pop something...}一般来说,都需要在while(condition) wait()来防止假唤醒。

杨魅力

这段代码在高并发的情况下会出现锁竞争激烈,性能低下的问题。其它的死锁什么的不会出现,不要想太多了。高并发场景建议用concurrent linked queue,分段加锁,能降低锁竞争

一只斗牛犬

list变量每个线程进来都会new一个新的吧

千万里不及你

首先synchronized修饰方法的问题对于非static方法,其作用相当于synchronized(this):synchronized void method(){// method body}// 等价于void method() {&nbsp; &nbsp;synchronized(this){&nbsp; &nbsp; &nbsp; &nbsp;// method body&nbsp; &nbsp;}}对于static方法,其相当于synchronized(YourClass.class):class YourClass {&nbsp; &nbsp;synchronized static void method() {&nbsp; &nbsp; &nbsp; &nbsp;// method body&nbsp; &nbsp;}&nbsp; &nbsp;// 等价于&nbsp; &nbsp;static void method() {&nbsp; &nbsp; &nbsp; &nbsp;synchronized(YourClass.class) {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;// method body&nbsp; &nbsp; &nbsp; &nbsp;}&nbsp; &nbsp;}}其次关于假唤醒问题,就是@spance说的。官方docde描述是:A thread can also wake up without being notified, interrupted, or timing out, a so-called spurious wakeup.官方给出的解决方案是:synchronized (obj) {&nbsp; &nbsp; &nbsp;while (<condition does not hold>)&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;obj.wait();&nbsp; &nbsp; &nbsp;... // Perform action appropriate to condition&nbsp; }The doc
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java