Я получаю многопоточность Java. Я очень хорошо знаком с C/C++ pthreads, но у меня проблемы с функциями Java notify()
и wait()
.Почему это вызывает исключение IllegalMonitorStateException?
Я понимаю, что IllegalMoinitorStateException
вызывается только тогда, когда поток, который не имеет «собственного» (он же не синхронизирован), вызывает уведомление/ожидание.
При написании приложения я столкнулся с этой проблемой. Я изолировал проблему с помощью следующего кода теста:
public class HelloWorld
{
public static Integer notifier = 0;
public static void main(String[] args){
notifier = 100;
Thread thread = new Thread(new Runnable(){
public void run(){
synchronized (notifier){
System.out.println("Notifier is: " + notifier + " waiting");
try{
notifier.wait();
System.out.println("Awake, notifier is " + notifier);
}
catch (InterruptedException e){e.printStackTrace();}
}
}});
thread.start();
try{
Thread.sleep(1000);
}
catch (InterruptedException e){
e.printStackTrace();
}
synchronized (notifier){
notifier = 50;
System.out.println("Notifier is: " + notifier + " notifying");
notifier.notify();
}
}
}
Это выходы:
Exception in thread "main" java.lang.IllegalMonitorStateException
at java.lang.Object.notify(Native Method)
at HelloWorld.main(HelloWorld.java:27)
Я считаю, что я уже приобрел замок на объекте уведомителя. Что я делаю не так?
Спасибо!
EDIT:
Из этого возможного дубликата (Synchronizing on an Integer value), кажется, что это не очень хорошая идея, чтобы синхронизировать на Integer, потому что трудно убедиться, что вы синхронизируете на том же экземпляре. Поскольку мое целое число, с которым я синхронизируюсь, является глобальным неподвижным статическим целым числом, почему я получаю разные экземпляры?
Возможные дубликат: HTTP: //stackoverflow.com/questions/659915/synchronizing-on-an-integer-value – Cratylus
Просто еще один намек, так как он уже был дан ответ: попробуйте установка уведомителя на конечный. Он не будет компилироваться, поскольку вы назначаете другое значение (объект) для уведомителя. –