2009-07-30 81 views
1

在我最近的一个答案,我给了限制访问的理论信号灯为例,内存资源:单个java信号量的死锁?

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

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

回答

2

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

+0

谢谢。我更感兴趣的是如何在异常情况下进行回滚 - 在示例情况下,它很容易,只需释放并返回到第1行并重试即可。但是,当线程内分配更加远离时(例如,封装昂贵的计算),我担心这也无济于事。也许我应该回到更粗糙的粒度锁定模式? – akarnokd 2009-07-30 09:30:09