在我最近的回答之一中,我举了一个理论上的信号量示例来限制对内存资源的访问:
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/