面试题答案
一键面试-
具体实现步骤:
- 定义一个共享资源,比如一个变量。
- 声明一个
sync.Mutex
类型的变量作为互斥锁。 - 在需要访问共享资源的代码块前后分别调用互斥锁的
Lock
方法和Unlock
方法。Lock
方法用于锁定资源,阻止其他Goroutine访问,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
锁定资源,修改counter
后调用mu.Unlock
解锁资源。在main
函数中启动多个Goroutine调用increment
函数,最后输出counter
的最终值,由于使用了互斥锁,counter
的操作不会出现数据竞争。