MST

星途 面试题库

面试题:Go并发编程中互斥锁解决资源竞争的基本原理

在Go并发编程中,当使用互斥锁(`sync.Mutex`)来解决资源竞争问题时,请详细阐述互斥锁是如何工作的,以及在代码中如何正确使用它来保护共享资源。
50.3万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

互斥锁工作原理

  1. 基本概念:互斥锁(sync.Mutex)是一种同步原语,它通过限制同一时间只有一个 goroutine 能够访问共享资源,从而避免资源竞争。
  2. 锁定机制:当一个 goroutine 调用互斥锁的 Lock 方法时,如果此时互斥锁处于未锁定状态,该 goroutine 会立即获取锁并将其锁定,其他试图获取锁的 goroutine 会被阻塞,直到该锁被解锁。
  3. 解锁机制:当持有锁的 goroutine 调用互斥锁的 Unlock 方法时,互斥锁会被解锁,此时等待队列中的一个 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
    for i := 0; i < 1000; i++ {
        wg.Add(1)
        go increment(&wg)
    }
    wg.Wait()
    fmt.Println("Final counter value:", counter)
}

在上述代码中:

  1. 声明互斥锁和共享资源:声明了一个共享变量 counter 和一个 sync.Mutex 类型的互斥锁 mu
  2. 使用互斥锁保护共享资源:在 increment 函数中,在访问和修改 counter 之前调用 mu.Lock() 获取锁,操作完成后调用 mu.Unlock() 释放锁,确保同一时间只有一个 goroutine 能修改 counter
  3. 并发执行:在 main 函数中,启动 1000 个 goroutine 并发调用 increment 函数,通过 sync.WaitGroup 等待所有 goroutine 执行完毕,最后输出 counter 的最终值,确保结果的正确性。