Punto morto su un singolo semaforo java?
-
05-07-2019 - |
Domanda
In una delle mie recenti risposte, ho dato un teorico esempio semaforo di limitazione dell'accesso alle risorse di memoria:
public static byte[] createArray(int size) throws InterruptedException {
semaphore.acquire(size);
return new byte[size];
}
public static void releaseArray(byte[] array) {
semaphore.release(array.length);
}
Penso che questo possa essere una fonte di deadlock se l'interleaving dell'allocazione non è buona:
semaphore = new Sempaphore(30, true);
// T1 T2
//-------------------------- ----------------------
a1 = createArray(10); // 20
a3 = createArray(10); // 10
a2 = createArray(15); // wait
a4 = createArray(15); // wait
// ... // ...
releaseArray(a1); releaseArray(a3);
releaseArray(a2); releaseArray(a4);
La mia osservazione è vera? In caso affermativo, come posso evitare questa situazione (ad es. Attesa temporizzata e rollback)?
Soluzione
Sì, usando Semaphore.tryAcquire (permessi, timeout, timeUnit)
sarebbe la cosa sensata da fare qui. Ovviamente devi stare attento a rilasciare il semaforo in un blocco finalmente
per evitare perdite ...
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow