MST

星途 面试题库

面试题:Go语言中如何使用互斥锁来确保Goroutine的并发安全

请描述在Go语言中使用互斥锁(`sync.Mutex`)来防止多个Goroutine同时访问共享资源的基本步骤,并给出一个简单的示例代码。
25.7万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 基本步骤
    • 声明一个互斥锁变量,类型为 sync.Mutex
    • 在需要保护共享资源的代码段前调用互斥锁的 Lock 方法,这会阻止其他Goroutine进入该代码段,直到当前Goroutine调用 Unlock 方法。
    • 在访问完共享资源后,调用互斥锁的 Unlock 方法,以允许其他Goroutine获取锁并访问共享资源。
  2. 示例代码
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 的最终值。