Frage

In einem meiner letzten Antwort, ich habe ein theoretische Semaphore Beispiel für den Zugriff auf Speicherressourcen zu beschränken:

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

Ich denke, dies ist eine Quelle der Deadlock sein kann, wenn die Zuordnung Verschachtelung ist schlecht:

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

Ist meine Beobachtung wahr? Wenn ja, wie kann ich diese Situation vermeiden (zum Beispiel zeitlich Warte und Rollback)?

War es hilfreich?

Lösung

Ja, Semaphore.tryAcquire(permits, timeout, timeUnit) mit der Vernünftigste wäre, hier zu tun. Offensichtlich haben Sie vorsichtig sein, bekommen die Semaphore in einem finally Block zu lösen Undichtigkeiten zu vermeiden ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top