Ciao. Sono uno studente e sono alle prese per le prime volte con la programmazione concorrente.
Devo fare un esercizio in cui devo allocare delle risorse usando i semafori:

Realizzare, usando i semafori, un allocatore di un sistema
di due pool r1 e r2 di, rispettivamente, n1 ed n2 risorse equivalenti,
utilizzando l'algoritmo del banchiere (in forma stretta).

in seguito mi viene data la lista di metodi tra cui riporto quelli che mi interessano:

- boolean alloc(int req1, int req2)
chiamata non sospensiva per allocare rispettivamente req1 e req2
risorse da r1 e r2; restituisce true se l'allocazione ha avuto luogo,
false se non era immediatamente possibile;

- boolean alloc(int req1, int req2, long timeout)
come la precedente ma sospensiva fino a quando l'allocazione è possibile
o è scaduto il timeout.

il primo senza il timeOut l'ho fatta.

il secondo ho provato in questo modo:

if (condizione){
//allocazione
}else {
la.add(ThreadCorrente);//la è una lista
waitingA++;//variabile che conta i thread in attesa dell'allocazione
wait(timeout);
waitingA--;
la.removeFirst();
}

Se è giusto vuol dire che un altro Thread quando rilascia delle risorse
dovrà fare una notify() verso i Thread che sono in attesa dell'allocazione.
quindi io ho pensato di farlo così all'interno del metodo run():

release();//rilascio delle risorse
if(condizione)
la.getFirst().notify();

la compilazione non mi da errori ma quando faccio partire il programma,
dopo un po' (la prima volta che entra nell'else della prima parte) mi
solleva illegalMonitorStateException.
Vuol dire che il thread che esegue per esempio la notify() non possiede il Lock, ma non so come fare per evitarlo!

AIUTATEMI VI PREGO!!!