MST
星途 面试题库

面试题:Go语言中Mutex如何在并发环境下保护共享资源

请描述在Go语言中,如何使用Mutex来确保多个并发的goroutine安全地访问共享资源。请给出一个简单示例代码,包含至少两个goroutine对同一个共享变量进行读写操作,并通过Mutex进行并发控制。
45.9万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
package main

import (
    "fmt"
    "sync"
)

var (
    count int
    mu    sync.Mutex
)

func main() {
    var wg sync.WaitGroup
    wg.Add(2)

    go func() {
        defer wg.Done()
        for i := 0; i < 1000; i++ {
            mu.Lock()
            count++
            mu.Unlock()
        }
    }()

    go func() {
        defer wg.Done()
        for i := 0; i < 1000; i++ {
            mu.Lock()
            count--
            mu.Unlock()
        }
    }()

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

在上述代码中:

  1. 定义了一个共享变量count,初始值为0。
  2. 定义了一个sync.Mutex类型的变量mu用于保护count
  3. 启动两个goroutine,一个goroutine对count进行1000次加1操作,另一个goroutine对count进行1000次减1操作。
  4. 在对count进行读写操作前,通过mu.Lock()锁定互斥锁,操作完成后通过mu.Unlock()解锁互斥锁,这样就确保了同一时间只有一个goroutine可以访问count,避免了竞态条件。
  5. 使用sync.WaitGroup等待两个goroutine执行完毕,最后打印出count的最终值。