MST

星途 面试题库

面试题:Go语言中Mutex实现线程安全操作的基本原理

请简要阐述在Go语言里,Mutex(互斥锁)是如何实现线程安全操作的,并且举例说明在一个简单的共享变量读写场景中,如何正确使用Mutex来保证数据一致性。
37.5万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

Mutex实现线程安全操作原理

在Go语言中,Mutex(互斥锁)通过控制同一时间只有一个goroutine能够访问共享资源来实现线程安全操作。当一个goroutine获取到锁后,其他goroutine试图获取锁时会被阻塞,直到持有锁的goroutine释放锁。Mutex内部维护了一个状态标识锁的占用情况,以及一个等待队列来管理阻塞的goroutine

共享变量读写场景示例

package main

import (
    "fmt"
    "sync"
)

var (
    count int
    mu    sync.Mutex
)

func increment(wg *sync.WaitGroup) {
    defer wg.Done()
    mu.Lock()
    count++
    mu.Unlock()
}

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 10; i++ {
        wg.Add(1)
        go increment(&wg)
    }
    wg.Wait()
    fmt.Println("Final count:", count)
}

在上述代码中,count是共享变量,muMutex实例。在increment函数中,通过mu.Lock()获取锁,对count进行操作后,通过mu.Unlock()释放锁,从而保证在多goroutine环境下对count的操作是线程安全的,确保数据一致性。