MST

星途 面试题库

面试题:Go语言中并发函数的同步机制

在Go语言中,假设有多个并发函数同时操作一个共享资源,可能会引发数据竞争问题。请阐述如何使用`sync.Mutex`来确保数据的一致性,并给出一个简单的示例代码。
35.4万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

阐述

在Go语言中,sync.Mutex(互斥锁)用于保护共享资源。当一个goroutine获取到互斥锁时,其他goroutine必须等待该锁被释放才能获取并操作共享资源,从而避免数据竞争,确保数据的一致性。具体使用时,在访问共享资源前调用Lock方法获取锁,访问结束后调用Unlock方法释放锁。

示例代码

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.Println("Final counter value:", counter)
}

在上述代码中,counter是共享资源,mu是互斥锁。increment函数在增加counter前获取锁,操作完成后释放锁。在main函数中启动1000个goroutine并发调用increment函数,最后输出counter的最终值,由于使用了互斥锁,不会出现数据竞争导致结果不准确的情况。