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

如何取消延期陈述

桑璞
2023-03-14
问题内容

我具有以下代码结构,其中我在同一点的A点锁定了(),并且肯定需要在同一函数中的B点锁定(解锁)。在A点和B点之间,由于需要Unlock()的错误,我有多次返回。使用defer lock.Unlock()A点解决了万一有错误的锁将被释放的问题。但是,如果执行成功到达B点-无论如何我该如何取消该defer和Unlock()?

func foo() {
    ...
    // point A
    lock.Lock()
    defer lock.Unlock()
    ...
    err := bar()
    if err != nil {
        return
    }
    ...
    //point B - need to definetely unlock here
    //lock.Unlock() ?
}

问题答案:

您无法取消延迟功能。

您可以sync.Once用来确保互斥锁被完全解锁一次:

func foo() {
    var unlockOnce sync.Once

    // point A
    lock.Lock()
    defer unlockOnce.Do(lock.Unlock)
    ...
    err := bar()
    if err != nil {
        return
    }
    ...
    // point B - need to unlock here
    unlockOnce.Do(lock.Unlock)
}

如果可能,最好重构代码,以使锁定部分保留在单个函数中:

func fooLock() error {
    lock.Lock()
    defer lock.Unlock()
    if err := bar(); err != nil { return err }
    ...
    return nil
}

func foo() {
    if err := fooLock(); err != nil { return }
    ... do the bit that doesn't need a lock
}

显然,这里的命名和错误处理很松懈,因为代码是通用的而不是特定的。如果您需要B点之前的代码块中的信息(现在在中的代码中)fooLock,则可以将其与错误一起返回。



 类似资料:
  • 问题内容: 因此,我已经看到了一些与此相关的主题,并且需要一些有关如何专门修复它的帮助。按住某个键时,Java将读取第一次按键,然后稍有延迟,然后它将连续读取按键,直到您松开按键为止。 那是我当前的代码。我听说要解决此问题,您可以创建一个计时器来快速检查按键是否按下,但是我不确定如何执行此操作。在这里或者如果有更好的解决方案,将不胜感激。 问题答案: 您问题的基本答案是,延迟不能是特定于操作系统的

  • 如何延迟JMS消息发送或在不确定的时间内继续? 我使用的是Weblogic,正如您所知,在JMS发送之后,接收方将异步处理消息,但是,此时或有时外部资源还没有为接收方做好准备,因此,我想使用一些检查逻辑来延迟发送或处理消息。我猜例如:我将消息放入挂起队列,然后频繁检查资源可用性,一旦发送或继续消息? 大家都知道Weblogic是否支持这一点,或者如何实现它吗?

  • 本文向大家介绍proimise 如何取消相关面试题,主要包含被问及proimise 如何取消时的应答技巧和注意事项,需要的朋友参考一下 No description provided.

  • 本文向大家介绍如何取消promise?相关面试题,主要包含被问及如何取消promise?时的应答技巧和注意事项,需要的朋友参考一下 Promise/A+标准规定了:原Promise对象跟新返回的对象状态一致。所以可以通过返回一个始终是pending状态的Promise对象来取消Promise。 Promise.resolve().then(() => { console.log(1) return

  • 问题内容: 我需要优化使用该子句和字段的PostgreSQL查询的帮助。 我有2张桌子: 包含约3394行 包含约4000000行 在PK和FK和上都有btree索引。 我想执行类似的查询: 该查询在大约7秒钟内检索到大约1.700.000行。 解释分析报告下报告: 未使用时间戳列上的索引。如何优化此查询? 问题答案: 查询将在不到一秒钟的时间内执行。其他6+秒用于服务器和客户端之间的流量。

  • 我试图发送个别的SQS消息延迟。使用https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-send-message-with-timer.html测试消息延迟,我没有看到任何延迟。 如果我在队列上设置了一个延迟,那么该延迟将被接受,但是对于单个消息则不会。我正在执行以下操作(全部来自AWS控制台