According to Oracle Javadoc:

____
``++IllegalMonitorStateException++`` is thrown when a thread has attempted to wait on an object's monitor or to notify other threads waiting on an object's monitor without owning the specified monitor.

____

In other words, this exception can be thrown only in case of bad design because ``++Object.wait(...)++``, ``++Object.notify()++`` and ``++Object.notifyAll()++`` methods should never be called on an object whose monitor is not held. 


== Noncompliant Code Example

----
public void doSomething(){
  ...
  try {
    ...
    anObject.notify();
    ...
  } catch(IllegalMonitorStateException e) {
    ...
  }
}
----


== Compliant Solution

----
public void doSomething(){
  ...
  synchronized(anObject) {
    ...
    anObject.notify();
    ...
  }
}
----


