MST

星途 面试题库

面试题:Go语言中Mutex锁常见错误场景分析

在Go语言中,假设我们有一个简单的计数器程序,使用Mutex来保护计数器变量。请分析以下代码可能存在的Mutex锁使用错误,并说明原因。 ```go package main import ( "fmt" "sync" ) var ( counter int mu sync.Mutex ) func increment() { mu.Lock() counter++ } func main() { var wg sync.WaitGroup for i := 0; i < 10; i++ { wg.Add(1) go func() { defer wg.Done() increment() }() } wg.Wait() fmt.Println("Final counter value: ", counter) } ```
25.1万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 问题
    • increment函数中没有解锁操作。当调用mu.Lock()后,没有对应的mu.Unlock(),这会导致其他试图获取该锁的goroutine永远阻塞。
  2. 原因
    • 在Go语言中,使用sync.Mutex进行同步时,LockUnlock操作必须成对出现。这里increment函数在counter++操作后没有调用mu.Unlock(),使得后续的goroutine调用mu.Lock()时会一直等待锁的释放,从而造成死锁(当其他goroutine需要这个锁才能继续执行时)。正确的做法应该是在counter++操作后调用mu.Unlock(),为了确保在函数返回时总是能解锁,通常使用defer mu.Unlock(),即在mu.Lock()后马上使用defer mu.Unlock(),这样无论函数以何种方式返回,锁都会被正确释放。修改后的increment函数如下:
func increment() {
    mu.Lock()
    defer mu.Unlock()
    counter++
}