面试题答案
一键面试Mutex应用场景
- 多协程访问共享数据:当多个协程需要同时访问和修改同一个数据结构时,如共享的变量、切片、映射等,为防止数据竞争导致的数据不一致问题,使用Mutex。例如,多个协程对一个全局计数器进行累加操作。
- 资源池管理:在管理有限资源(如数据库连接池、线程池等)时,确保同一时间只有一个协程能获取或释放资源,避免资源的重复使用或过度使用。
代码示例
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
numRoutines := 1000
for i := 0; i < numRoutines; i++ {
wg.Add(1)
go increment(&wg)
}
wg.Wait()
fmt.Println("Final counter value:", counter)
}
在上述代码中,counter
是共享资源,多个协程通过 increment
函数对其进行操作。mu
是一个 Mutex
实例,在对 counter
进行修改前,调用 mu.Lock()
锁定 Mutex
,防止其他协程同时修改,操作完成后调用 mu.Unlock()
释放锁,这样就保护了共享资源 counter
不出现数据竞争问题。