java - 单个java信号量上的死锁?

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

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

最佳答案

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

关于java - 单个java信号量上的死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1205430/

相关文章:

python - 链接多个队列时的 Tensorflow 竞争条件

concurrency - 为什么我不能在函数参数中使用 type []chan *Message as type []chan interface{}?

java - Spring Boot 从服务中的回调返回响应

java - WriteListener (servlet 3.1) 语义

java - 为什么我的 Java Echo 小程序不工作?

java - java swing多线程实现简单的二维动画

c# - 线程池会不会排队一个定时器的回调函数,有时会同时调度多个线程?

java - JPA:解决读取后写入的竞争条件

c++ - 使用 promise 和 future 将值从子线程传递给主线程

ruby - Ruby 纤程可以并发吗?