public class Stack{
LinkList list = new LinkList();
public synchronized void push(Object x){
synchroized(list){
list.addLast(x);
notify();
}
}
public synchroized Object pop() throw Exception{
synchroized(list){
if(list.size <= 0){
wait();
}
return list.removeLast();
}
}
}
这段代码在大多数时间运行是没有问题的,但是特殊情况下会出问题,请问会出现什么问题?问题的根源在哪里?
/DeadLockError Synchroized both on “list” and "this".
这是一个生产者,消费者模型。会出现死锁问题。既然是死锁,那肯定list 上的锁出现了问题,但这边已经有wait()出现了,暂时是放掉了占用锁,为什么还会死锁呢?原来,这里wait()释放的是方法的锁,即加在this 上的锁,list 上的锁并未释放,所以在push 方法中,就不能去执行notify(),pop 这边也不会被唤醒,所以就出现了死锁。