面试题答案
一键面试在Go语言中,为避免多个Goroutine对共享资源的读写操作导致资源竞争,可以使用以下同步机制:
- 互斥锁(
sync.Mutex
):适用于读写操作都需要保证原子性的场景,任何时刻只允许一个Goroutine进行读写操作。 - 读写锁(
sync.RWMutex
):适用于读多写少的场景,允许多个Goroutine同时读,但写操作时需要独占资源。
以下是使用读写锁的简单代码示例:
package main
import (
"fmt"
"sync"
)
var (
data int
rwmu sync.RWMutex
wg sync.WaitGroup
)
func reader(id int) {
defer wg.Done()
rwmu.RLock()
fmt.Printf("Reader %d reading data: %d\n", id, data)
rwmu.RUnlock()
}
func writer(id int) {
defer wg.Done()
rwmu.Lock()
data = id
fmt.Printf("Writer %d writing data: %d\n", id, data)
rwmu.Unlock()
}
func main() {
for i := 0; i < 3; i++ {
wg.Add(1)
go reader(i)
}
for i := 0; i < 3; i++ {
wg.Add(1)
go writer(i)
}
wg.Wait()
}
在上述代码中:
sync.RWMutex
定义了一个读写锁rwmu
。reader
函数使用rwmu.RLock()
进行读锁定,允许多个Goroutine同时读取数据,读操作完成后使用rwmu.RUnlock()
解锁。writer
函数使用rwmu.Lock()
进行写锁定,保证写操作的原子性,写操作完成后使用rwmu.Unlock()
解锁。main
函数启动了多个读和写的Goroutine,并使用sync.WaitGroup
等待所有Goroutine完成。