黑马程序员技术交流社区
标题:
一小段代码不知道怎么分析
[打印本页]
作者:
刃下心
时间:
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
if( list.size() <= 0 ) //这里改为while
{
wait();
}
复制代码
作者:
笑脸迷人
时间:
2014-8-31 06:55
是死锁吧~
public synchronized void push(Object x) //函数本身加了同步(锁)
{
synchronized(list) //锁中锁!
{
list.addLast( x );
notify();
}
}
复制代码
方法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