Pergunta

Em uma de minhas respostas recentes, eu dei um teórica exemplo do semáforo de limitar o acesso a recursos de memória:

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

Eu acho que isso pode ser uma fonte de impasse se a alocação de intercalação é ruim:

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

É a minha observação é verdade? Se sim, como posso evitar essa situação (por exemplo, espera temporizada e rollback)?

Foi útil?

Solução

Sim, usando Semaphore.tryAcquire(permits, timeout, timeUnit) seria a coisa sensata a fazer aqui. Obviamente você tem que ter cuidado para liberar o semáforo em um bloco finally a vazamentos Evitar ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top