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