方法wait()和notifyAll()不是静态的

时间:2013-03-07 20:56:07

标签: java multithreading wait producer-consumer notify

public synchronized  static int get() {
    while(cheia()==false){
        try{
            wait();
          }
        catch(InterruptedException e){
        }
    }

    if (fila[inicio] != 0) {
        int retornaValor = fila[inicio];
        fila[inicio] = 0;
        inicio++;
        if (inicio == size) {
            inicio = 0;
        }
        notifyAll();
        return retornaValor;
    }
    notifyAll();
    return 0;
}

为什么wait()和notifyAll()不在此代码中运行?

IDE说:方法wait()(或notifyAll)不是静态的吗?

你能帮助我吗?

4 个答案:

答案 0 :(得分:3)

这是因为您在静态方法中,这意味着该方法正在类实例而不是对象实例上执行。 waitnotify是实例方法。

改为创建对象锁,并使用它来进行同步和信令。

private static final Object lock = new Object();

public static int get(){
   synchronized(lock){
      lock.wait();
      lock.notify();
      ...etc
   } 
}

答案 1 :(得分:2)

同步的静态方法锁定Class对象,因此自然可以做到:

[youclass].class.wait();
[youclass].class.notify();

答案 2 :(得分:1)

您正在从静态方法调用非静态方法,例如wait()notifyAll()。你不能做这个。将您的get方法更改为此

public synchronized int get()

答案 3 :(得分:-1)

您对wait的期望是什么?你必须等待某个特定的对象被通知,这里没有任何对象。