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,

Другие вопросы по тегам