MST

星途 面试题库

面试题:Go中互斥锁(Mutex)与读写锁(RWMutex)的应用场景区别

在Go语言中,互斥锁(Mutex)和读写锁(RWMutex)是常用的同步原语。请阐述它们各自的应用场景,并且分别举一个简单的代码示例说明如何使用。
29.9万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

互斥锁(Mutex)

  1. 应用场景:当需要保护共享资源,确保同一时间只有一个 goroutine 能够访问该资源时,使用互斥锁。适用于读写操作都需要独占访问共享资源的场景,比如对共享变量的修改。
  2. 代码示例
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 < 10; i++ {
        wg.Add(1)
        go increment(&wg)
    }
    wg.Wait()
    fmt.Println("Final counter value:", counter)
}

读写锁(RWMutex)

  1. 应用场景:当对共享资源的读操作远远多于写操作时,使用读写锁。它允许同一时间有多个 goroutine 进行读操作,但写操作时需要独占访问,以确保数据一致性。
  2. 代码示例
package main

import (
    "fmt"
    "sync"
)

var (
    data    int
    rwMutex sync.RWMutex
)

func read(wg *sync.WaitGroup) {
    defer wg.Done()
    rwMutex.RLock()
    fmt.Println("Read value:", data)
    rwMutex.RUnlock()
}

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

func main() {
    var wg sync.WaitGroup
    for i := 0; i < 3; i++ {
        wg.Add(1)
        go read(&wg)
    }
    for i := 0; i < 2; i++ {
        wg.Add(1)
        go write(&wg)
    }
    wg.Wait()
}