MST

星途 面试题库

面试题:Go中互斥锁在高并发场景下如何防止竞态条件

在Go语言中,假设你有一个共享变量,在高并发场景下多个goroutine会同时读写这个变量。请简述使用互斥锁(`sync.Mutex`)来防止竞态条件的基本原理和代码实现方式。
13.1万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

基本原理

互斥锁(sync.Mutex)的基本原理是通过限制同一时间只有一个goroutine能够访问共享资源,从而防止竞态条件。当一个goroutine获取了互斥锁,其他试图获取该互斥锁的goroutine会被阻塞,直到该goroutine释放锁。这样就确保了在任何时刻,共享变量最多只有一个goroutine在进行读写操作,避免了多个goroutine同时读写导致的数据不一致问题。

代码实现方式

package main

import (
    "fmt"
    "sync"
)

var (
    sharedVar int
    mu        sync.Mutex
)

func increment(wg *sync.WaitGroup) {
    defer wg.Done()
    mu.Lock()
    sharedVar++
    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 value of sharedVar: %d\n", sharedVar)
}

在上述代码中:

  1. 定义了一个共享变量 sharedVar 和一个互斥锁 mu
  2. increment 函数用于对共享变量进行自增操作。在操作共享变量前,先调用 mu.Lock() 获取锁,操作完成后调用 mu.Unlock() 释放锁。
  3. main 函数中,创建了1000个goroutine并发执行 increment 函数,并通过 sync.WaitGroup 等待所有goroutine执行完毕。最后输出共享变量的最终值。通过这种方式,确保了在高并发场景下对共享变量的安全访问。