面试题答案
一键面试- 原理描述:
sync.Mutex
是Go语言提供的互斥锁。在并发环境下,当一个goroutine想要访问共享的计数器变量时,先获取互斥锁。这会阻止其他goroutine同时访问该变量,直到当前goroutine释放锁。这样就保证了同一时间只有一个goroutine可以对计数器进行操作,避免数据竞争。 - 示例代码:
package main
import (
"fmt"
"sync"
)
var (
counter int
mu sync.Mutex
)
func handleRequest(wg *sync.WaitGroup) {
defer wg.Done()
mu.Lock()
counter++
mu.Unlock()
}
func main() {
var wg sync.WaitGroup
numRequests := 10
for i := 0; i < numRequests; i++ {
wg.Add(1)
go handleRequest(&wg)
}
wg.Wait()
fmt.Printf("Total requests: %d\n", counter)
}
在上述代码中:
- 定义了一个全局的计数器变量
counter
和一个互斥锁mu
。 handleRequest
函数在对counter
进行自增操作前,先调用mu.Lock()
获取锁,操作完成后调用mu.Unlock()
释放锁。main
函数模拟了10个并发请求,通过sync.WaitGroup
等待所有请求处理完毕,最后输出总的请求数。