面试题答案
一键面试- 使用
sync.Mutex
避免数据竞争:sync.Mutex
(互斥锁)用于保护共享资源,确保在同一时间只有一个goroutine可以访问共享资源。当一个goroutine获取了锁,其他goroutine必须等待锁被释放后才能获取锁并访问共享资源。
- 使用
sync.WaitGroup
等待所有goroutine完成:sync.WaitGroup
用于等待一组goroutine完成。主goroutine可以使用WaitGroup
来阻塞,直到所有相关的goroutine都完成它们的任务。
- 代码示例:
package main
import (
"fmt"
"sync"
)
var (
counter int
mu sync.Mutex
wg sync.WaitGroup
)
func increment() {
defer wg.Done()
mu.Lock()
counter++
mu.Unlock()
}
func main() {
for i := 0; i < 10; i++ {
wg.Add(1)
go increment()
}
wg.Wait()
fmt.Println("Final counter value:", counter)
}
在上述代码中:
counter
是共享资源,多个goroutine会对其进行修改。mu
是sync.Mutex
类型的互斥锁,在increment
函数中,mu.Lock()
获取锁,确保只有一个goroutine可以执行counter++
操作,操作完成后通过mu.Unlock()
释放锁。wg
是sync.WaitGroup
类型,在启动每个goroutine前,通过wg.Add(1)
增加等待组的计数,在increment
函数中通过defer wg.Done()
减少计数,主goroutine通过wg.Wait()
等待所有goroutine完成任务,最后输出counter
的最终值。这样就避免了数据竞争问题。