面试题答案
一键面试Mutex锁主要用于以下常见并发场景:
- 共享数据访问:多个goroutine可能同时访问和修改同一个数据结构,如map、slice等,Mutex锁可防止数据竞争,确保数据一致性。
- 资源池管理:管理有限资源的分配,如数据库连接池、线程池等,防止多个goroutine同时获取相同资源。
代码示例如下:
package main
import (
"fmt"
"sync"
)
var (
counter int
mu sync.Mutex
)
func increment(wg *sync.WaitGroup) {
defer wg.Done()
mu.Lock()
counter++
mu.Unlock()
}
func main() {
var wg sync.WaitGroup
numGoroutines := 1000
for i := 0; i < numGoroutines; i++ {
wg.Add(1)
go increment(&wg)
}
wg.Wait()
fmt.Printf("Final counter value: %d\n", counter)
}
在上述代码中:
- 定义了一个共享变量
counter
和一个Mutex
锁mu
。 increment
函数中,在修改counter
之前调用mu.Lock()
加锁,修改完成后调用mu.Unlock()
解锁,以此保护counter
这个共享资源,防止多个goroutine同时修改导致数据竞争。main
函数中启动了1000个goroutine同时调用increment
函数,最后等待所有goroutine完成并输出counter
的最终值。