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
}