MST

星途 面试题库

面试题:Go中每个请求一个goroutine时如何确保简单数据结构的并发安全

在Go语言中,当为每个请求启动一个goroutine时,假设有一个共享的计数器变量,用于统计总的请求数。请描述如何使用`sync.Mutex`来确保这个计数器在并发环境下的安全访问,并给出示例代码。
39.3万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 原理描述sync.Mutex 是Go语言提供的互斥锁。在并发环境下,当一个goroutine想要访问共享的计数器变量时,先获取互斥锁。这会阻止其他goroutine同时访问该变量,直到当前goroutine释放锁。这样就保证了同一时间只有一个goroutine可以对计数器进行操作,避免数据竞争。
  2. 示例代码
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 等待所有请求处理完毕,最后输出总的请求数。