面试题答案
一键面试- 基本步骤:
- 声明一个互斥锁变量,类型为
sync.Mutex
。 - 在需要保护共享资源的代码段前调用互斥锁的
Lock
方法,这会阻止其他Goroutine进入该代码段,直到当前Goroutine调用Unlock
方法。 - 在访问完共享资源后,调用互斥锁的
Unlock
方法,以允许其他Goroutine获取锁并访问共享资源。
- 声明一个互斥锁变量,类型为
- 示例代码:
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.Printf("Final counter value: %d\n", counter)
}
在上述代码中,counter
是共享资源,mu
是互斥锁。increment
函数中通过 mu.Lock()
和 mu.Unlock()
来保护对 counter
的操作,确保在同一时间只有一个Goroutine可以修改 counter
。在 main
函数中,启动了1000个Goroutine并发调用 increment
函数,最后输出 counter
的最终值。