MST

星途 面试题库

面试题:Go中Mutex的基本使用场景有哪些

请简要阐述在Go语言中,Mutex通常会被应用在哪些类型的场景下,并且举例说明如何在代码中使用Mutex来保护共享资源。
30.8万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

Mutex应用场景

  1. 多协程访问共享数据:当多个协程需要同时访问和修改同一个数据结构时,如共享的变量、切片、映射等,为防止数据竞争导致的数据不一致问题,使用Mutex。例如,多个协程对一个全局计数器进行累加操作。
  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
    numRoutines := 1000

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

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

在上述代码中,counter 是共享资源,多个协程通过 increment 函数对其进行操作。mu 是一个 Mutex 实例,在对 counter 进行修改前,调用 mu.Lock() 锁定 Mutex,防止其他协程同时修改,操作完成后调用 mu.Unlock() 释放锁,这样就保护了共享资源 counter 不出现数据竞争问题。