在我最近的回答之一中,我举了一个理论上的信号量示例来限制对内存资源的访问:

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块中的信号量以避免泄漏...

关于java - 在单个Java信号灯上出现死锁?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1205430/

10-10 02:41