有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

当线程共享同一个矩阵字段(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) 个答案