关于Notify() wait()的一道面试题目

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 这边也不会被唤醒,所以就出现了死锁。



你可能感兴趣的:(关于Notify() wait()的一道面试题目)