MST

星途 面试题库

面试题:Go中如何使用互斥锁保证并发安全

在Go语言中,假设有多个goroutine同时访问和修改一个共享的变量,为了保证数据的并发安全,如何使用互斥锁(`sync.Mutex`)来解决这个问题?请编写一段简单的示例代码展示。
34.6万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
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 := 10

    for i := 0; i < numGoroutines; i++ {
        wg.Add(1)
        go increment(&wg)
    }

    wg.Wait()
    fmt.Println("Final counter value:", counter)
}

上述代码定义了一个共享变量 counter 和一个互斥锁 mu。在 increment 函数中,通过 mu.Lock() 锁定互斥锁,修改共享变量 counter,然后通过 mu.Unlock() 解锁互斥锁,确保在同一时间只有一个 goroutine 能够访问和修改 counter,从而保证数据的并发安全。在 main 函数中,启动多个 goroutine 执行 increment 函数,并使用 sync.WaitGroup 等待所有 goroutine 完成,最后输出 counter 的最终值。