Reports calls to wait(), notify(), and notifyAll() that are not made inside a corresponding synchronized statement or synchronized method.

Calling these methods on an object without holding a lock on that object causes IllegalMonitorStateException. Such a construct is not necessarily an error, as the necessary lock may be acquired before the containing method is called, but it's worth looking at.

Example:


  class Sync {
    private final Object lock = new Object();

    void test() throws InterruptedException {
      synchronized (this) {
        lock.wait(); // 'lock.wait()' is not synchronized on 'lock'
      }
    }
  }