面试题答案
一键面试package main
import (
"fmt"
"sync"
)
var (
count int
mu sync.Mutex
)
func main() {
var wg sync.WaitGroup
wg.Add(2)
go func() {
defer wg.Done()
for i := 0; i < 1000; i++ {
mu.Lock()
count++
mu.Unlock()
}
}()
go func() {
defer wg.Done()
for i := 0; i < 1000; i++ {
mu.Lock()
count--
mu.Unlock()
}
}()
wg.Wait()
fmt.Println("Final count:", count)
}
在上述代码中:
- 定义了一个共享变量
count
,初始值为0。 - 定义了一个
sync.Mutex
类型的变量mu
用于保护count
。 - 启动两个goroutine,一个goroutine对
count
进行1000次加1操作,另一个goroutine对count
进行1000次减1操作。 - 在对
count
进行读写操作前,通过mu.Lock()
锁定互斥锁,操作完成后通过mu.Unlock()
解锁互斥锁,这样就确保了同一时间只有一个goroutine可以访问count
,避免了竞态条件。 - 使用
sync.WaitGroup
等待两个goroutine执行完毕,最后打印出count
的最终值。