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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刃下心 中级黑马   /  2014-8-30 23:10  /  1158 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刃下心 于 2014-9-1 12:38 编辑

下面的代码有时候运行得很正常,有时候会出现问题。怎么解




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();
                }
        }
}

5 个回复

倒序浏览
有时候运行得很正常,有时候会出现问题。那一定是同步出现问题啦。
主函数是什么,看下调用过程
回复 使用道具 举报
  1.                       if( list.size() <= 0 ) //这里改为while
  2.                         {
  3.                                  wait();
  4.                          }
复制代码

回复 使用道具 举报
是死锁吧~
  1. public synchronized void push(Object x) //函数本身加了同步(锁)
  2.         {
  3.                 synchronized(list) //锁中锁!
  4.                 {
  5.                         list.addLast( x );
  6.                         notify();
  7.                 }
  8.         }
复制代码
方法public synchronized void push(Object x)  本身已经加了同步(锁),而这个锁是调用这个函数的对象,
方法中同步代码块的锁又是list,那么锁中有锁,两锁不一致,这样就会容易死锁
另外的一个方法也是同样的问题


评分

参与人数 1技术分 +1 收起 理由
天黑偷牛 + 1 认真回答别人的问题是一种美德.

查看全部评分

回复 使用道具 举报 1 0
已经是同步函数了!就不需要同步代码块了!这样会造成不是同一个锁!因此会运行时,有时出错!有时正常!
回复 使用道具 举报
笑脸迷人 发表于 2014-8-31 06:55
是死锁吧~
方法public synchronized void push(Object x)  本身已经加了同步(锁),而这个锁是调用这个函数 ...

明白了,原来是这样
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马