By contract, the method ``++Object.wait(...)++``, ``++Object.notify()++`` and ``++Object.notifyAll()++`` should be called by a thread that is the owner of the object's monitor. If this is not the case an ``++IllegalMonitorStateException++`` exception is thrown. This rule reinforces this constraint by making it mandatory to call one of these methods only inside a ``++synchronized++`` method or statement. 


== Noncompliant Code Example

----
private void removeElement() {
  while (!suitableCondition()){
    obj.wait();
  }
  ... // Perform removal
}
----

or


----
private void removeElement() {
  while (!suitableCondition()){
    wait();
  }
  ... // Perform removal
}
----


== Compliant Solution

----
private void removeElement() {
  synchronized(obj) {
    while (!suitableCondition()){
      obj.wait();
    }
    ... // Perform removal
  }
}
----

or


----
private synchronized void removeElement() {
  while (!suitableCondition()){
    wait();
  }
  ... // Perform removal
}
----

ifdef::env-github,rspecator-view[]

'''
== Implementation Specification
(visible only on this page)

include::message.adoc[]

endif::env-github,rspecator-view[]
