面试题答案
一键面试资源竞争场景描述
假设有一个简单的计数器程序,多个Goroutine同时对这个计数器进行累加操作。由于多个Goroutine并发执行,可能会出现一个Goroutine读取计数器的值,还未进行累加操作时,另一个Goroutine也读取了相同的值,导致最终结果不准确,这就是资源竞争问题。
使用sync.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
numGoroutines := 1000
for i := 0; i < numGoroutines; i++ {
wg.Add(1)
go increment(&wg)
}
wg.Wait()
fmt.Println("Final counter value:", counter)
}
在上述代码中:
counter
是共享资源,即需要被多个Goroutine访问和修改的变量。mu
是一个sync.Mutex
实例,用于保护共享资源counter
。- 在
increment
函数中,通过mu.Lock()
加锁,保证在同一时间只有一个Goroutine可以访问和修改counter
,操作完成后通过mu.Unlock()
解锁。 - 在
main
函数中,启动1000个Goroutine并发执行increment
函数,等待所有Goroutine执行完毕后,输出最终的计数器值,这样可以确保计数器值的准确性,避免资源竞争问题。