当前位置: 首页 > 面试题库 >

尝试捕获信号量的正确方法

严亦
2023-03-14
问题内容

将信号量动作包装在try-
catch块中的正确方法是什么?如果在获取一定数量(但不是全部)所请求的许可后中断获取动作,会发生什么情况?你怎么知道又要释放多少?应该将发布放到一个“最终”块中,但是如果操作被中断,您是否不可以发布未获得的许可?

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)方法是一项全有或全无的操作,您将获得所有请求的许可或被阻止。您可以对代码进行两次尝试,也可以让(可能的)中断的异常阻止气泡进入调用堆栈。

双重尝试块:

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

切线切记,信号量必须通过严格的编程约定来保持平衡,因此,您应始终释放所获得的尽可能多的许可。



 类似资料:
  • 问题内容: 我喜欢Typescript等中提供的新功能的平坦性。但是,我不确定我是否必须在块的外部声明要输入的变量以便以后使用,这一点我不确定。像这样: 如果我错了,请纠正我,但是似乎最好的做法是不要在主体中放置多行业务逻辑,因此,我只剩下在块外声明,在块中分配,以及然后使用它。 在这种情况下,最佳做法是什么? 问题答案: 似乎最好的做法是不要在try主体中放置多行业务逻辑 其实我会说是的。通常,

  • 本文向大家介绍JSON.parse 捕获异常的正确方法,包括了JSON.parse 捕获异常的正确方法的使用技巧和注意事项,需要的朋友参考一下 捕获无效JSON解析错误的最佳方法,是将对JSON.parse的调用放在try / catch块中。 示例

  • 问题内容: 我想在Go中实现“流程包装器”。基本上它将执行的是启动一个进程(比如说一个节点服务器)并监视它(捕获诸如SIGKILL,SIGTERM之类的信号…) 我认为要做的方法是使用以下命令在go例程中启动节点服务器: 然后,我想捕获由执行的命令生成的所有可能的信号。我是Go的新手,我们将不胜感激。 问题答案: Go中有三种执行程序的方式: 包含syscall.Exec,syscall.Fork

  • 我有一个存储过程似乎没有正确记录错误。 代码有错误,但 catch 块似乎未生效。 try块相当长,但错误部分很简单,并且在最后出现,所以我已经对此进行了预测。 proc失败的错误是我们的老朋友“列名或提供的值的数量与表定义不匹配”。我已经修复了这个错误 - 这是一个愚蠢的懒惰错误 - 但我感到困惑为什么我的错误日志记录过程似乎没有工作 - 没有行入到我的 ExtractsErrorLog 表中。

  • 问题内容: 我经常遇到如下情况: 仍然需要尝试-最终在内部捕获块。 克服此问题的最佳实践是什么? 问题答案: 写一个类,其中包含捕获和记录此类异常的方法,然后根据需要使用。 您最终会看到如下内容: 您的客户端代码将类似于: 更新: 自Java 7开始,各种JDBC接口都得到了扩展,而以上代码回答了原始问题,如果您直接针对JDBC API编写代码,则现在可以对其进行结构化:

  • 问题内容: 在Linux下的python 2.6中,我可以使用以下命令来处理TERM信号: 除了仅一次设置一个信号,是否可以为该过程接收的所有信号设置处理程序? 问题答案: 您可以循环浏览信号模块中的信号并进行设置。