1

在我最近的一个答案中,我给出了一个限制访问内存资源的理论信号量示例:

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);

我的观察是真的吗?如果是,我怎样才能避免这种情况(例如定时等待和回滚)?

4

1 回答 1

2

是的,使用Semaphore.tryAcquire(permits, timeout, timeUnit)将是明智的做法。显然,您必须小心在finally块中释放信号量以避免泄漏......

于 2009-07-30T09:23:48.070 回答