java - try catch 信号量的正确方法

标签 java try-catch semaphore

在 try-catch block 中包装信号量操作的正确方法是什么?如果 acquire 操作在获得一些(但不是全部)所请求的许可后被中断,会发生什么情况?你怎么知道要再次释放多少?是否应该在“finally” block 中发布,但如果操作被中断,您是否可能发布您未获得的许可?

try {
    lock.acquire(permits);

    //Do some things that require synchronization

    //Make sure to release all of the permits again!
    lock.release(permits);
} catch (InterruptedException e) {
    log.error("Interrupted!");
}

最佳答案

Semaphore.acquire(int) 方法是一个全有或全无的操作,要么获得所有请求的许可,要么阻止。您可以对您的代码使用双重尝试,或者让(可能的)中断异常从获取冒泡到您的调用堆栈。

双重尝试 block :

try {
    lock.acquire(permits);

    try {
        // do some stuff here
    } finally {
        lock.release(permits);
    }
} catch(final InterruptedException ie) {
    // handle acquire failure here
}

气泡“获取”异常:

lock.acquire(permits);

try {
    // do some stuff here
} finally {
    lock.release(permits);
}

切线,请记住,信号量必须通过严格的编程约定保持平衡,因此您应该始终释放与获得的许可一样多的许可。

关于java - try catch 信号量的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15139231/

相关文章:

java - 用于推送通知和通知绑定(bind)的 ExchangeService 对象(EWS 应用程序)

java - 是否可以捕获除运行时异常之外的所有异常?

c++ - C++11 condition_variables 可以用于同步进程吗?

java - 信号量同步 wait() 和 notify()

linux - 关于使用信号量执行线程的操作系统作业问题

java - 无法使用 p6Spy

java - 运行我生成的 .jar 会产生 "Can' t 在 AMD 64 位平台上加载此 .dll(机器代码=0xbd)”

java - 如何将多个模型属性添加到一个模型属性中?

java - 循环 try-catch 不起作用

ruby catch 和效率