﻿# V6125\. Calling the 'wait', 'notify', and 'notifyAll' methods outside of synchronized context will lead to 'IllegalMonitorStateException'\.

Анализатор обнаружил, что методы 'wait', 'notify', 'notifyAll' могут быть вызваны в несинхронизированном контексте\.

```cpp
public void someMethod() {
    notify();
}

public void anotherMethod() throws InterruptedException {
    wait();
}
```

Методы 'wait', 'notify', 'notifyAll' [работают](https://docs.oracle.com/en/java/javase/22/docs/api/java.base/java/lang/Object.html#notify()) с монитором объекта, по которому происходит синхронизация\. То есть их вызов корректен только в синхронизированном контексте и только на объекте, по которому происходит синхронизация\.

В случае, если методы 'wait', 'notify' или 'notifyAll' вызвать в несинхронизированном контексте или не на том объекте, по которому синхронизация происходит, произойдёт выброс исключения 'IllegalMonitorStateException'\.

Пример корректного использования в 'synchronized' блоке: 

```cpp
private final Object lock = new Object();

public void someCorrectMethod() {
    synchronized (lock) {
        lock.notify();
    }
}
```

Поскольку синхронизация идёт по объекту 'lock', вызов метода 'notify' корректен только на объекте 'lock'\.

Корректное использование в 'synchronized' методе:

```cpp
public synchronized void anotherCorrectMethod() {
    notifyAll();
}
```

Фрагмент выше эквивалентен следующему:

```cpp
public void anotherCorrectMethod() {
    synchronized (this) {
        notifyAll();
    }
}
```

Из этого следует, что в данной ситуации метод 'notifyAll' корректно вызывать только на 'this' объекте\.