单个java信号量死锁?

时间:2009-07-30 09:18:49

标签: java multithreading concurrency deadlock semaphore

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

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

我的观察结果是否正确?如果是,我该如何避免这种情况(例如定时等待和回滚)?

1 个答案:

答案 0 :(得分:2)

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