mutex.Lock和deferred mutex.Unock命令

时间:2017-11-22 05:08:45

标签: go locking deferred

golang中的

,sync.Mutex Lock和Unlock是usul操作,但是Lock和defer Unlock的正确顺序是什么?

mu.Lock()
defer mu.Unlock()

defer mu.Unlock()
mu.Lock()

哪个最好?

3 个答案:

答案 0 :(得分:5)

没关系。

无论哪种方式,defer都会导致mu.Unlock()在退出当前范围时执行(例如,返回的函数)。

第一种方法更为可取,因为它具有更自然的排序(锁定,然后解锁)以供人类阅读。

答案 1 :(得分:2)

我看到第一个变体更自然,更易读。您可能会看到锁被获取并且在相同的代码片段中它准备好释放:

mu.Lock()
defer mu.Unlock()

无论如何,延迟函数调用将在稍后执行 - 在函数退出时执行。

答案 2 :(得分:0)

延迟

  

延迟语句推迟执行函数,直到周围的函数返回。

     

立即计算延迟调用的参数,但在周围函数返回之前不会执行函数调用。

两个变体都是相同的,因为放置defer红色函数无关紧要,它将在周围函数返回后执行。

注意如果您有多个defer红色函数,它将按照defer声明的顺序以相反的顺序执行。