MST

星途 面试题库

面试题:Go语言中互斥锁的基本使用

请用Go语言代码示例展示如何使用互斥锁来保护共享资源,假设共享资源是一个整数变量,有两个协程对其进行读写操作。并简要说明为什么要使用互斥锁以及互斥锁的原理。
40.5万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

Go语言代码示例

package main

import (
    "fmt"
    "sync"
)

var (
    count int
    mu    sync.Mutex
)

func read(wg *sync.WaitGroup) {
    defer wg.Done()
    mu.Lock()
    fmt.Println("Read value:", count)
    mu.Unlock()
}

func write(wg *sync.WaitGroup) {
    defer wg.Done()
    mu.Lock()
    count++
    fmt.Println("Write value:", count)
    mu.Unlock()
}

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

    go read(&wg)
    go write(&wg)

    wg.Wait()
}

为什么要使用互斥锁

在多协程环境下,共享资源(如上述的 count 变量)可能会被多个协程同时访问和修改。如果没有适当的保护机制,就会出现竞态条件(race condition),导致数据不一致或程序行为不可预测。互斥锁可以确保在同一时间只有一个协程能够访问共享资源,从而避免竞态条件,保证数据的一致性和程序的正确性。

互斥锁的原理

互斥锁(Mutex,即Mutual Exclusion的缩写)的原理基于操作系统提供的原子操作。当一个协程调用 Lock 方法时,如果锁当前未被占用,该协程会获取锁并继续执行;如果锁已被其他协程占用,调用 Lock 的协程会被阻塞,直到锁被释放(通过调用 Unlock 方法)。这样就保证了同一时间只有一个协程能够访问受互斥锁保护的共享资源。