面试题答案
一键面试为了防止竞态条件的发生,可以使用Go语言中的sync.Mutex
(互斥锁)来保护共享资源。sync.Mutex
提供了一种机制,确保在同一时间只有一个goroutine可以访问共享资源。
下面是一个结合WaitGroup
和sync.Mutex
的示例代码:
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() {
numGoroutines := 1000
for i := 0; i < numGoroutines; i++ {
wg.Add(1)
go increment()
}
wg.Wait()
fmt.Printf("Final counter value: %d\n", counter)
}
在上述代码中:
counter
是共享资源,所有goroutine都会对其进行修改。mu
是一个sync.Mutex
实例,用于保护counter
。wg
是一个sync.WaitGroup
实例,用于同步所有goroutine。
在increment
函数中,通过调用mu.Lock()
来锁定互斥锁,确保在同一时间只有一个goroutine可以修改counter
。修改完成后,调用mu.Unlock()
释放锁。
在main
函数中,启动1000个goroutine,每个goroutine都会调用increment
函数。通过wg.Wait()
等待所有goroutine完成,最后输出counter
的最终值。这样就可以有效地防止竞态条件的发生。