Question

Dans l'une de mes réponses récentes, j'ai donné un exemple de sémaphore théorique pour limiter l'accès aux ressources mémoire:

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);
}

Je pense que cela peut être une source de blocage si l’entrelacement d’allocation est mauvais:

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

Est-ce que mon observation est vraie? Si oui, comment puis-je éviter cette situation (par exemple, une attente et une annulation chronométrées)?

Était-ce utile?

La solution

Oui, utiliser Semaphore.tryAcquire (permis, délai d'attente, timeUnit) serait la bonne chose à faire ici. Évidemment, vous devez faire attention à libérer le sémaphore dans un bloc finally pour éviter les fuites ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top