Уведомление об исключении java .lang.IllegalMonitorStateException Locks - PullRequest
2 голосов
/ 29 марта 2020

Я пробовал сценарий ожидания и уведомления, получая -> Исключение в потоке "Thread-1" java .lang.IllegalMonitorStateException при вызове уведомления.

Метод wait снимает блокировку, поэтому поток B может выполнить поток из и B, я вызываю lock.notify для потока A.

Не могли бы вы помочь мне в этом?

class SynchronizedCodee  {

    int a = 5;
    Lock lock = new ReentrantLock();
    public void threadA()
    {
        lock.lock();
        try {
            lock.wait();
            System.out.println("A = "+a);
        } catch (Exception e) {
            // TODO Auto-generated catch block
//          e.printStackTrace();
        }
        finally
        {
            lock.unlock();
        }
    }

    public void threadB()
    {
        if(lock.tryLock())
        {
        this.a = 11;
        System.out.println("B = "+a);
                lock.notify(); // getting erro over here
        }
        else
        {
            System.out.println("didn't managed to get a lock");
        }
    }

}
class ThreadA extends Thread{
    SynchronizedCodee s;
    public ThreadA(SynchronizedCodee s) {
        this.s = s;
    }
    public void run()
    {
        s.threadA();
    }
}

class ThreadB extends Thread{
    SynchronizedCodee s;
    public ThreadB(SynchronizedCodee s) {
        this.s = s;
    }
    public void run()
    {
        s.threadB();
    }
}
public class SynchronizedCode{
    public static void main(String ag[]) throws InterruptedException
    {
        SynchronizedCodee s = new SynchronizedCodee();
        ThreadA t1  = new ThreadA(s);
        ThreadB t2  = new ThreadB(s);
        t1.start();
        Thread.sleep(100);
        t2.start();

    }
}

1 Ответ

3 голосов
/ 29 марта 2020

Вы вызываете wait и уведомляете о явных объектах блокировки, что недопустимо. Если вы используете явные объекты блокировки, вы должны использовать связанный с ним объект Condition. Затем вы должны вызывать методы condition.awai t и condition.signalAll вместо wait и notify. Вот идиома использования явных блокировок в вашем конкретном сценарии.

final Condition setA = lock.newCondition();
public void threadA() {
    lock.lock();
    try {
        while (a == 5)
            setA.await();
        System.out.println("A = " + a);
    } catch (InterruptedException e) {
        Thread.currentThread().interrupt();
    } finally {
        lock.unlock();
    }
}

public void threadB() {
    lock.lock();
    try {
        this.a = 11;
        System.out.println("B = " + a);
        setA.signalAll();
    } finally {
        lock.unlock();
    }
}

И эта программа выдает следующий вывод:

B = 11
A = 11
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...