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)?

È stato utile?

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
scroll top