本帖最后由 java2000_net 于 2008-08-05 15:36:24 编辑

解决方案 »

  1.   

    我估计在wait中的线程,notify未必能叫的醒……
      

  2.   

    是不是
    因为只有主线程一个线程在执行
    当执行
    if(list.size() <=0)
    wait();
    的时候
    就停住不往下走了
    自然就不会触发notify()方法了。 
      

  3.   

    显然死锁了
    执行pop后都把list锁住了,后边的push就在synchronized (list)一句堵住了
      

  4.   

    用list做信号量肯定是错的 我用一个Object作为信号量,但是结果有时候会出错import java.util.LinkedList;public class TestStack2 {

    Object mutex ; LinkedList<Object> list ; public TestStack2() {
    } public TestStack2(LinkedList<Object> list ,Object mutex) {
    this.list = list;
    this.mutex = mutex;
    }

    public void push(Object x) {
    synchronized (mutex) { 
    list.addLast(x); 
    mutex.notifyAll(); 

    } public Object pop() throws Exception {
    synchronized (mutex) { 
    if(list.size() <=0) 
    mutex.wait(); 
    return list.removeLast(); 

    }

    /**
     * @param args
     * @throws Exception 
     */
    public static void main(String[] args) throws Exception {
    // TODO 自动生成方法存根
    LinkedList<Object> list = new LinkedList<Object>();
    Object mutex = new Object();
    for(int i = 0;i < 3; i++)
    new TDeleteObject(list,mutex).start();

    for(int i = 0;i < 3; i++)
    new TAddObject(list,mutex).start();
    }}class TAddObject extends Thread{

    TestStack2 test ;

    public TAddObject(LinkedList<Object> list,Object mutex) {
    test = new TestStack2(list,mutex);
    }

    public void run(){
    test.push(Thread.currentThread().getName());
    }
    }class TDeleteObject extends Thread {

    TestStack2 test ;

    public TDeleteObject(LinkedList<Object> list,Object mutex) {
    test = new TestStack2(list,mutex);
    }

    public void run(){
    try {
    String str = test.pop().toString();
    System.out.println(str);
    } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }结果为什么有时候是错误的?