下面的代码在绝大部分时间内都运行得很正常,请问什么情况下会出问题?问题的根源在哪里?

import java.util.LinkedList;

public class lsdf {

    LinkedList list = new LinkedList();
    public synchronized void push(Object x){
        synchronized (list){
            list.addLast(x);
            notify();
        }
    }
    public synchronized  Object pop() throws InterruptedException {

    synchronized (list) {
        if (list.size() <= 0) {
                wait();
            }
            return list.removeLast();
        }
    }
}

问题的根源在于你这把锁,如果是同一个对象来使用这把锁可以因为sync为可重入锁,如果是不同的线程则产生阻塞;