如何修复使用ReentrantLock和Condition的函数中的java.lang.IllegalMonitorStateException?

时间:2019-02-10 19:47:35

标签: java javafx

当线程共享矩阵(platform[x][y])的相同字段时,线程同步出现问题。我尝试使用ReentrantLockCondition

当我尝试调用函数时是同步代码,然后抛出:

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;
        }

    }

如何正确进行同步?

0 个答案:

没有答案