0

アプリケーションで異なるスレッドを同期しようとしています。基本的に、アプリケーションの終了をブロックできるはずのスレッドがいくつかあります。ここに私が持っているものがあります:

public class Test{
  public static void main(String args[]){
    Syncer syncer = new Syncer();
    Object o = new Object();
    syncer.lockExit(o);
    //.. do some stuff//
    syncer.unlockExit(o);
  }
}

public class Syncer {

    private List<Object> l_Exit;

    public Syncer() {
        l_Exit = new ArrayList<Object>();
    }

    public synchronized void lockExit(Object o) {
        l_Exit.add(o);
    }

    public synchronized void unlockExit(Object o) {
        l_Exit.remove(o);
        if (l_Exit.isEmpty()) {
            l_Exit.notifyAll();
        }
    }

    public synchronized void waitForExit() {
        while (!l_Exit.isEmpty()) {
            try {
                l_Exit.wait();
            } catch (InterruptedException ex) {
                Test.log.log(Level.SEVERE, null, ex);
            }
        }
    }
}

syncer.unlockExit(o); を実行すると IllegalMonitorException が発生します。

4

1 に答える 1

0
public synchronized void unlockExit(Object o) {
    l_Exit.remove(o);
    if (l_Exit.isEmpty()) {
        l_Exit.notifyAll();
    }
}

Object.wait()、Object.notify()、または Object.notifyAll() が機能するには、同期ブロックにいる必要があります。

public synchronized void unlockExit(Object o) {
     synchronized (lock) {
        l_Exit.remove(o);
        if (l_Exit.isEmpty()) {
          l_Exit.notifyAll();
        }
     }
}

理由については、この質問を参照してください。

于 2013-08-22T04:06:18.313 に答える