面试题答案
一键面试资源竞争易产生的情况
- 多个 goroutine 同时读写共享变量:当多个 goroutine 同时对同一个变量进行读和写操作时,就可能出现资源竞争。例如多个 goroutine 同时向一个共享的 map 中写入数据。
- 共享通道操作冲突:多个 goroutine 同时对同一个通道进行发送(send)或接收(receive)操作,可能导致竞争状态。比如多个 goroutine 尝试同时向一个已满的无缓冲通道发送数据。
示例
- 共享变量读写竞争
package main
import (
"fmt"
"sync"
)
var counter int
var wg sync.WaitGroup
func increment() {
defer wg.Done()
for i := 0; i < 1000; i++ {
counter++
}
}
func main() {
for i := 0; i < 10; i++ {
wg.Add(1)
go increment()
}
wg.Wait()
fmt.Println("Final counter value:", counter)
}
在这个例子中,多个 goroutine 同时对 counter
变量进行递增操作,由于没有同步机制,会产生资源竞争,导致 counter
的最终值不可预测。
- 通道操作竞争
package main
import (
"fmt"
"sync"
)
func sendData(ch chan int, wg *sync.WaitGroup) {
defer wg.Done()
for i := 0; i < 10; i++ {
ch <- i
}
close(ch)
}
func receiveData(ch chan int, wg *sync.WaitGroup) {
defer wg.Done()
for val := range ch {
fmt.Println("Received:", val)
}
}
func main() {
var wg sync.WaitGroup
ch := make(chan int, 5)
wg.Add(2)
go sendData(ch, &wg)
go receiveData(ch, &wg)
wg.Wait()
}
如果多个 sendData
函数尝试同时向 ch
通道发送数据,而通道容量有限,就可能在通道满时产生竞争。如果没有合理的同步,程序行为将不可预测。