日期:2014-05-18  浏览次数:20733 次

有一个阿里88的面试题 第四题 我感觉是 死锁
有一个阿里88的面试题原题是java的, 我感觉是死锁,但java版没人提这个, 看看这边C#有大牛能看出来吗?

如果是,鄙视以下哪些搞java的

原题在这里 第四题:

http://topic.csdn.net/u/20120315/14/91f69b1a-2d18-4512-ab77-34799eaad132.html



下面的代码大部分情况下没有问题,在什么情况下会有问题?为什么?
java code

Java code
public class Stack {

    LinkedList list = new LinkedList();

    public synchronized void push(Object x){

       synchronized(this){

           list.addLast(x);

           notify();

       }

    } 

    public synchronized Object pop() throws Exception{

       synchronized(this){

           if(list.size() <= 0){

              wait();

           }

           return list.removeLast();

       }

    }

    public static void main(String[] args) {
 

    }

}


------解决方案--------------------
你这个wait有点问题,如果开始没有item,你直接pop,是不是就死锁了,push都无法进行了
------解决方案--------------------

------解决方案--------------------
其实就是pop和push的执行顺序,只要先进入wait,就可能出问题吧,不惊动java,从字面上看而已
------解决方案--------------------
Java code

            public synchronized Object pop() throws Exception{

               synchronized(this){

                   if(list.size() > 0){

                      return list.removeLast();

                   }             

               }
                return pop();

            }

------解决方案--------------------
探讨

其实就是pop和push的执行顺序,只要先进入wait,就可能出问题吧,不惊动java,从字面上看而已