当线程共享矩阵(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;
}
}
如何正确进行同步?