面试题答案
一键面试Mutex实现线程安全操作原理
在Go语言中,Mutex
(互斥锁)通过控制同一时间只有一个goroutine
能够访问共享资源来实现线程安全操作。当一个goroutine
获取到锁后,其他goroutine
试图获取锁时会被阻塞,直到持有锁的goroutine
释放锁。Mutex
内部维护了一个状态标识锁的占用情况,以及一个等待队列来管理阻塞的goroutine
。
共享变量读写场景示例
package main
import (
"fmt"
"sync"
)
var (
count int
mu sync.Mutex
)
func increment(wg *sync.WaitGroup) {
defer wg.Done()
mu.Lock()
count++
mu.Unlock()
}
func main() {
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go increment(&wg)
}
wg.Wait()
fmt.Println("Final count:", count)
}
在上述代码中,count
是共享变量,mu
是Mutex
实例。在increment
函数中,通过mu.Lock()
获取锁,对count
进行操作后,通过mu.Unlock()
释放锁,从而保证在多goroutine
环境下对count
的操作是线程安全的,确保数据一致性。