문제

나의 최근 답변 중 하나에서 나는 이론적 인 메모리 리소스에 대한 액세스 제한의 세마포어 예 :

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 누출을 피하기 위해 블록 ...

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top