A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© ㄨ____陌生 中级黑马   /  2013-4-2 17:03  /  1189 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 ㄨ____陌生 于 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();
}
}
}


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

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1 赞一个!

查看全部评分

2 个回复

倒序浏览
多线程的时候,如果有多个线程push 多个线程 pop 假如某一时刻LinkedList里面没有元素,pop操作的线程就会放弃锁等待,当醒来时可能没有元素或在wait的过程中加入了元素但被其它线程取走了,这时LinkedList为空。

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

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

评分

参与人数 1技术分 +1 收起 理由
张熙韬 + 1

查看全部评分

回复 使用道具 举报
如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马