IllegalMonitorStateException внутри синхронизированного блока
Хотя я написал ожидание внутри синхронизированного блока. я получаю IllegalMonitorStateException
, В чем причина тогда?
package trials;
public class WaitNotifyTrial {
public static void main(String[] args){
Generator g=new Generator();
g.start();
System.out.println("Start");
synchronized (g) {
try {
g.wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
System.out.println("Printing exception");
e.printStackTrace();
}
System.out.println(g.value);
}
}
}
class Generator extends Thread{
int value;
public void run(){
synchronized (this) {
value=10;
}
notify();
}
}
}
1 ответ
Вот некоторые вещи, которые не так с вашим кодом:
- ты звонишь
notify()
внеsynchronized (this)
(это ваша непосредственная проблема); - вы не используете правильную идиому цикла ожидания, рискуя тем самым недетерминированным поведением / тупиками перед лицом ложных пробуждений и пропущенных уведомлений;
- вы используете
wait-notify
механизм наThread
экземпляр, который рекомендуется в своей документации; - вы расширяете
Thread
вместо того, чтобы использовать этот класс как есть, и только передать ему экземпляр вашей реализацииRunnable
,
В течение почти целого десятилетия общим советом было избегать wait-notify
механизм в целом и вместо этого использовать один из средств синхронизации от java.util.concurrent
, такой как CountDownLatch
,