MST

星途 面试题库

面试题:Go语言中Mutex锁的常规使用场景及示例

请阐述在Go语言中,Mutex锁主要用于哪些常见的并发场景,并编写一段简单的代码示例,展示如何使用Mutex锁来保护共享资源。
29.3万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

Mutex锁主要用于以下常见并发场景:

  1. 共享数据访问:多个goroutine可能同时访问和修改同一个数据结构,如map、slice等,Mutex锁可防止数据竞争,确保数据一致性。
  2. 资源池管理:管理有限资源的分配,如数据库连接池、线程池等,防止多个goroutine同时获取相同资源。

代码示例如下:

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)
}

在上述代码中:

  1. 定义了一个共享变量counter和一个Mutexmu
  2. increment函数中,在修改counter之前调用mu.Lock()加锁,修改完成后调用mu.Unlock()解锁,以此保护counter这个共享资源,防止多个goroutine同时修改导致数据竞争。
  3. main函数中启动了1000个goroutine同时调用increment函数,最后等待所有goroutine完成并输出counter的最终值。