Этот код может вызвать исключение IllegalMonitorStateException
void waitForSignal(){
Object ob =new Object();
synchronized (Thred.currentThread()) {
try {
ob.wait();
ob.notify();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Этот метод создает исключение IllegalMonitorStateException. Может кто-нибудь объяснить, почему так.
заранее спасибо
3 ответа
Решение
Вы должны только призвать wait
на объекте, на котором вы приобрели блокировку.
В вашем коде вы приобрели блокировку на Thread.currentThread()
, но вы вызываете его на ob
, который бросит IllegalMonitorStateException
,
Итак, вы должны изменить свой синхронизированный блок на: -
synchronized (ob) {
}
Вы хотите выполнить синхронизацию на ожидаемом объекте:
synchronized (ob) {
try {
ob.wait();
ob.notify();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Если даже вы исправили свою проблему с IllegalMonitorException, как
void waitForSignal() {
Object ob = new Object();
synchronized (ob) {
ваш код не будет работать В вашем коде каждый поток создает новую блокировку, невидимую вне метода. Нет возможности для других потоков уведомлять ожидающие темы.