V6125. Calling the 'wait', 'notify', and 'notifyAll' methods outside of synchronized context will lead to 'IllegalMonitorStateException'.
Анализатор обнаружил, что методы 'wait', 'notify', 'notifyAll' могут быть вызваны в несинхронизированном контексте.
public void someMethod() {
notify();
}
public void anotherMethod() throws InterruptedException {
wait();
}
Методы 'wait', 'notify', 'notifyAll' работают с монитором объекта, по которому происходит синхронизация. То есть их вызов корректен только в синхронизированном контексте и только на объекте, по которому происходит синхронизация.
В случае, если методы 'wait', 'notify' или 'notifyAll' вызвать в несинхронизированном контексте или не на том объекте, по которому синхронизация происходит, произойдёт выброс исключения 'IllegalMonitorStateException'.
Пример корректного использования в 'synchronized' блоке:
private final Object lock = new Object();
public void someCorrectMethod() {
synchronized (lock) {
lock.notify();
}
}
Поскольку синхронизация идёт по объекту 'lock', вызов метода 'notify' корректен только на объекте 'lock'.
Корректное использование в 'synchronized' методе:
public synchronized void anotherCorrectMethod() {
notifyAll();
}
Фрагмент выше эквивалентен следующему:
public void anotherCorrectMethod() {
synchronized (this) {
notifyAll();
}
}
Из этого следует, что в данной ситуации метод 'notifyAll' корректно вызывать только на 'this' объекте.