黑马程序员技术交流社区

标题: 一小段代码不知道怎么分析 [打印本页]

作者: 刃下心    时间: 2014-8-30 23:10
标题: 一小段代码不知道怎么分析
本帖最后由 刃下心 于 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();
                }
        }
}


作者: WakeUp    时间: 2014-8-31 04:25
有时候运行得很正常,有时候会出现问题。那一定是同步出现问题啦。
主函数是什么,看下调用过程
作者: hejinzhong    时间: 2014-8-31 05:04
  1.                       if( list.size() <= 0 ) //这里改为while
  2.                         {
  3.                                  wait();
  4.                          }
复制代码


作者: 笑脸迷人    时间: 2014-8-31 06:55
是死锁吧~
  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,那么锁中有锁,两锁不一致,这样就会容易死锁
另外的一个方法也是同样的问题



作者: 奋发吧小白    时间: 2014-8-31 07:34
已经是同步函数了!就不需要同步代码块了!这样会造成不是同一个锁!因此会运行时,有时出错!有时正常!
作者: 刃下心    时间: 2014-8-31 18:16
笑脸迷人 发表于 2014-8-31 06:55
是死锁吧~
方法public synchronized void push(Object x)  本身已经加了同步(锁),而这个锁是调用这个函数 ...

明白了,原来是这样




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