MST

星途 面试题库

面试题:Go语言中Mutex和RWMutex适用场景差异

请简要阐述在Go语言中,Mutex和RWMutex分别适用于什么样的读写场景,并举例说明在哪些实际业务场景中可以使用这两种锁。
36.7万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

Mutex适用场景

Mutex(互斥锁)适用于读写操作都需要互斥访问共享资源的场景,即同一时间只允许一个 goroutine 进行读或写操作。因为它会完全阻塞其他试图访问该资源的 goroutine,不管是读操作还是写操作。

例如,在银行转账操作中,涉及到对账户余额的修改,这是一个典型的写操作场景。同一时间只能有一个转账操作对账户余额进行修改,否则会导致数据不一致。示例代码如下:

package main

import (
    "fmt"
    "sync"
)

var (
    balance int
    mu      sync.Mutex
)

func transfer(amount int) {
    mu.Lock()
    balance = balance + amount
    mu.Unlock()
}

RWMutex适用场景

RWMutex(读写互斥锁)适用于读操作远远多于写操作的场景。它允许同时有多个 goroutine 进行读操作,但是当有一个 goroutine 进行写操作时,会阻塞其他所有的读和写操作。

例如,在一个文章阅读系统中,文章内容通常会被大量用户读取,但只有管理员等少数角色会进行修改(写操作)。此时就可以使用 RWMutex。示例代码如下:

package main

import (
    "fmt"
    "sync"
)

var (
    content string
    rwmu    sync.RWMutex
)

func read() string {
    rwmu.RLock()
    defer rwmu.RUnlock()
    return content
}

func write(newContent string) {
    rwmu.Lock()
    content = newContent
    rwmu.Unlock()
}