Impasse sur un seul sémaphore java?
-
05-07-2019 - |
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)?
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