Impasse em um único semáforo java?
-
05-07-2019 - |
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)?
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