面试题答案
一键面试Go语言代码示例
package main
import (
"fmt"
"sync"
)
var (
count int
mu sync.Mutex
)
func read(wg *sync.WaitGroup) {
defer wg.Done()
mu.Lock()
fmt.Println("Read value:", count)
mu.Unlock()
}
func write(wg *sync.WaitGroup) {
defer wg.Done()
mu.Lock()
count++
fmt.Println("Write value:", count)
mu.Unlock()
}
func main() {
var wg sync.WaitGroup
wg.Add(2)
go read(&wg)
go write(&wg)
wg.Wait()
}
为什么要使用互斥锁
在多协程环境下,共享资源(如上述的 count
变量)可能会被多个协程同时访问和修改。如果没有适当的保护机制,就会出现竞态条件(race condition),导致数据不一致或程序行为不可预测。互斥锁可以确保在同一时间只有一个协程能够访问共享资源,从而避免竞态条件,保证数据的一致性和程序的正确性。
互斥锁的原理
互斥锁(Mutex,即Mutual Exclusion的缩写)的原理基于操作系统提供的原子操作。当一个协程调用 Lock
方法时,如果锁当前未被占用,该协程会获取锁并继续执行;如果锁已被其他协程占用,调用 Lock
的协程会被阻塞,直到锁被释放(通过调用 Unlock
方法)。这样就保证了同一时间只有一个协程能够访问受互斥锁保护的共享资源。