面试题答案
一键面试资源竞争问题
当多个Goroutine同时读写共享变量时,可能会出现资源竞争问题。例如,一个Goroutine正在读取共享变量的值,而另一个Goroutine同时在修改该变量的值,这可能导致读取到的值是不一致或不正确的。
使用sync.Mutex
解决资源竞争问题
sync.Mutex
是一种互斥锁,用于保证在同一时间只有一个Goroutine可以访问共享资源。以下是使用sync.Mutex
实现多个Goroutine对共享变量读写操作的代码示例:
package main
import (
"fmt"
"sync"
)
var (
sharedVariable int
mu sync.Mutex
)
func write(wg *sync.WaitGroup) {
defer wg.Done()
mu.Lock()
sharedVariable++
mu.Unlock()
}
func read(wg *sync.WaitGroup) {
defer wg.Done()
mu.Lock()
fmt.Println("Read value:", sharedVariable)
mu.Unlock()
}
func main() {
var wg sync.WaitGroup
for i := 0; i < 5; i++ {
wg.Add(1)
go write(&wg)
}
for i := 0; i < 5; i++ {
wg.Add(1)
go read(&wg)
}
wg.Wait()
}
使用sync.RWMutex
解决资源竞争问题
sync.RWMutex
是读写锁,允许多个Goroutine同时读取共享资源,但只允许一个Goroutine进行写操作。以下是使用sync.RWMutex
实现多个Goroutine对共享变量读写操作的代码示例:
package main
import (
"fmt"
"sync"
)
var (
sharedVariable int
rwmu sync.RWMutex
)
func write(wg *sync.WaitGroup) {
defer wg.Done()
rwmu.Lock()
sharedVariable++
rwmu.Unlock()
}
func read(wg *sync.WaitGroup) {
defer wg.Done()
rwmu.RLock()
fmt.Println("Read value:", sharedVariable)
rwmu.RUnlock()
}
func main() {
var wg sync.WaitGroup
for i := 0; i < 5; i++ {
wg.Add(1)
go write(&wg)
}
for i := 0; i < 5; i++ {
wg.Add(1)
go read(&wg)
}
wg.Wait()
}