단일 자바 세마포어의 교착 상태?
-
05-07-2019 - |
문제
나의 최근 답변 중 하나에서 나는 이론적 인 메모리 리소스에 대한 액세스 제한의 세마포어 예 :
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);
내 관찰이 사실입니까? 그렇다면 어떻게이 상황을 피할 수 있습니까 (예 : 시간 대기 및 롤백)?
해결책
예, 사용 Semaphore.tryAcquire(permits, timeout, timeUnit)
여기서해야 할 일이 될 것입니다. 분명히 당신은 세마포어를 finally
누출을 피하기 위해 블록 ...
제휴하지 않습니다 StackOverflow