黑马程序员技术交流社区

标题: wait和notify机制、 [打印本页]

作者: ㄨ____陌生    时间: 2013-4-2 17:03
标题: wait和notify机制、
本帖最后由 ㄨ____陌生 于 2013-4-3 13:30 编辑

public class Stack {

LinkedList list = new LinkedList();

public synchronized void push(Object x) {
synchronized(list) {
list.addLast( x );
notify();
}
}

public synchronized Object pop()
throws Exception {
synchronized(list) {
if( list.size() <= 0 ) {
wait();
}
return list.removeLast();
}
}
}


在什么情况下会出现问题?问题的根源在哪里??

作者: 蓝色骨头    时间: 2013-4-2 19:00
多线程的时候,如果有多个线程push 多个线程 pop 假如某一时刻LinkedList里面没有元素,pop操作的线程就会放弃锁等待,当醒来时可能没有元素或在wait的过程中加入了元素但被其它线程取走了,这时LinkedList为空。

if( list.size() <= 0 ) {
wait();
}
改为
while(list.size() <= 0 ){
        wait();
}

还有只用同步代码块就可以了,使用list锁,这样可以提高效率。像你原来那么写第二个锁是浪费。
可以将notify() 换成notifyAll() , 否则在多线程时假如每次唤醒的都是pop的线程而LinkedList为空,所有线程就只能永远等待,这里最好使用condition

作者: 黄玉昆    时间: 2013-4-3 12:19
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2