MST
星途 面试题库

面试题:Go语言中如何使用互斥锁解决Goroutine的数据竞争问题

请描述在Go语言中,使用互斥锁(sync.Mutex)来防止多个Goroutine同时访问共享资源,以避免数据竞争的具体实现步骤,并给出一个简单的代码示例。
26.5万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 具体实现步骤

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