黑马程序员技术交流社区
标题:
关于多线程的代码的一个问题
[打印本页]
作者:
王少雷
时间:
2013-1-10 22:54
标题:
关于多线程的代码的一个问题
本帖最后由 王少雷 于 2013-1-12 11:23 编辑
import java.util.LinkedList;
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();
}
}
}
这个代码大多数运行没问题,求高手点明有可能出现的BUG情况。
作者:
王阳
时间:
2013-1-10 23:31
这个应该是唤醒和等待的方法需要调用 list.wait();方法吧
作者:
高境
时间:
2013-1-10 23:33
王阳 发表于 2013-1-10 23:31
这个应该是唤醒和等待的方法需要调用 list.wait();方法吧
:handshake
作者:
马铿
时间:
2013-1-11 01:17
本帖最后由 马铿 于 2013-1-11 13:54 编辑
这段代码,我测试了一下,BUG是有的,程序会挂
第一种挂法:public synchronized Object pop() throws Exception {
synchronized (list) {
if (list.size() <= 0) {
wait();
}
System.out.println("现在集合里的对象个数为。。。。。。。。。"+list.size());
return list.removeLast();
}
程序先执行这个线程,直接挂这里了
!--------------------------------------------------------------------------------------
第二中挂法:程序运行到一半挂了。
因为用了2个不同对象的锁,一个是Stack,一个是list,会出现死锁现象,解决办法是去掉一个list锁,因为只要锁住Stakc,该对象里面的成员list也就不能用了
public synchronized Object pop()这句话是拿到了Stack对象
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2