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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王少雷 高级黑马   /  2013-1-10 22:54  /  1336 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王少雷 于 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:33

评分

参与人数 1技术分 +1 收起 理由
高境 + 1 赞一个!

查看全部评分

3 个回复

正序浏览
本帖最后由 马铿 于 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对象

评分

参与人数 1技术分 +1 收起 理由
舒远 + 1 很给力!同步锁不一致导致的问题。.

查看全部评分

回复 使用道具 举报
王阳 发表于 2013-1-10 23:31
这个应该是唤醒和等待的方法需要调用  list.wait();方法吧

:handshake
回复 使用道具 举报
这个应该是唤醒和等待的方法需要调用  list.wait();方法吧
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马