面试题答案
一键面试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()
}