Тупик на одном семафоре Java? - PullRequest
1 голос
/ 30 июля 2009

В одном из моих недавних ответов я привел теоретический * семафор пример ограничения доступа к ресурсам памяти:

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

Я думаю, что это может стать источником тупика, если перемежение распределения плохо:

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

Мое наблюдение верно? Если да, как я могу избежать этой ситуации (например, время ожидания и откат)?

1 Ответ

2 голосов
/ 30 июля 2009

Да, использование Semaphore.tryAcquire(permits, timeout, timeUnit) было бы разумно сделать здесь. Очевидно, вы должны быть осторожны, чтобы освободить семафор в блоке finally, чтобы избежать утечек ...

...