Как исправить java.lang.IllegalMonitorStateException в функции, которые используют ReentrantLock и Condition? - PullRequest
0 голосов
/ 10 февраля 2019

У меня проблема с синхронизацией потоков, когда ее доля совпадает с полем матрицы (platform[x][y]).Я пытаюсь использовать ReentrantLock и Condition.

Когда я пытаюсь вызвать функцию, когда код синхронизации выдает:

Exception in thread "Thread-58" java.lang.IllegalMonitorStateException
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.signal(AbstractQueuedSynchronizer.java:1939)

Функция:

public boolean postaviVoziloNaZadatoMjestoNaPlatformi(Vozilo vozilo, int x, int y)
{
    if(vozilo.isAlive())
    {
        if(platform[x][y]==null)
        {
            vozilo.setPozicijaX(x);
            vozilo.setPozicijaY(y);
            platform[x][y]=vozilo;
            return true;

        }
        else if("SLOBODAN".equals(platform[x][y]))
        {
            Garage.brojSlobodnihMjestaPoPlatformi[vozilo.getBrojPlatforme()-1]--;
            vozilo.setPozicijaX(x);
            vozilo.setPozicijaY(y);
            platform[x][y]=vozilo;
            listaVozila.add(vozilo);
            return true;
        }
        else if(vozilo instanceof JavnoVozilo)
        {
            vozilo.setPozicijaX(x);
            vozilo.setPozicijaY(y);
            return false;
        }
        else if(platform[x][y] instanceof Vozilo)
        {
            lock.lock();
            try
            {
                while(postavljanje)
                {
                    try {
                        cond.await();
                    } catch (InterruptedException ex) {
                        Logger.getLogger(Platforma.class.getName()).log(Level.WARNING, null, ex);
                    }
                }
            }
            finally
            {
                lock.unlock();
            }
            postavljanje=true;
            vozilo.setPozicijaX(x);
            vozilo.setPozicijaY(y);
            lock.lock();
            try {
                postavljanje=false;
                cond.signal();  //this is line where is problem
            } finally {
                lock.unlock();
            }
            return true;
        }

    }

Как правильно сделать синхронизацию?

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