У меня проблема с синхронизацией потоков, когда ее доля совпадает с полем матрицы (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;
}
}
Как правильно сделать синхронизацию?