golang 并发题目测试
题目来源: Go并发编程小测验: 你能答对几道题?
1 Mutex
package main
import (
"fmt"
"sync"
)
var mu sync.Mutex
var chain string
func main() {
chain = "main"
A()
fmt.Println(chain)
}
func A() {
mu.Lock()
defer mu.Unlock()
chain = chain + " --> A"
B()
}
func B() {
chain = chain + " --> B"
C()
}
func C() {
mu.Lock()
defer mu.Unlock()
chain = chain + " --> C"
}A: 不能编译
B: 输出 main --> A --> B --> C
C: 输出 main
D: panic
2 RWMutex
A: 不能编译
B: 输出 1
C: 程序hang住
D: panic
3 Waitgroup
A: 不能编译
B: 无输出,正常退出
C: 程序hang住
D: panic
4 双检查实现单例
A: 不能编译
B: 可以编译,正确实现了单例
C: 可以编译,有并发问题,f函数可能会被执行多次
D: 可以编译,但是程序运行会panic
5 Mutex
A: 不能编译
B: 输出 1, 1
C: 输出 1, 2
D: panic
6 Pool
A: 不能编译
B: 可以编译,运行时正常,内存稳定
C: 可以编译,运行时内存可能暴涨
D: 可以编译,运行时内存先暴涨,但是过一会会回收掉
7 channel
A: 不能编译
B: 一段时间后总是输出
#goroutines: 1C: 一段时间后总是输出
#goroutines: 2D: panic
8 channel
A: 不能编译
B: 输出 1
C: 输出 0
D: panic
9 Map
A: 不能编译
B: 输出 1
C: 输出 0
D: panic
10 happens before
A: 不能编译
B: 输出 1
C: 输出 0
D: panic
答案
1. D
会产生死锁panic,因为Mutex 是互斥锁。
2. D
会产生死锁panic,根据sync/rwmutex.go 中注释可以知道,读写锁当有一个协程在等待写锁时,其他协程是不能获得读锁的,而在A和C中同一个调用链中间需要让出读锁,让写锁优先获取,而A的读锁又要求C调用完成,因此死锁。
3. D
WaitGroup 在调用 Wait 之后是不能再调用 Add 方法的。
4. C
在多核CPU中,因为CPU缓存会导致多个核心中变量值不同步。
5. D
加锁后复制变量,会将锁的状态也复制,所以mu1 其实是已经加锁状态,再加锁会死锁。
6. C
个人理解,在单核CPU中,内存可能会稳定在256MB,如果是多核可能会暴涨。
7. C
因为 ch 未初始化,写和读都会阻塞,之后被第一个协程重新赋值,导致写的ch 都阻塞。
8. D
ch 未有被初始化,关闭时会报错。
9. A
sync.Map 没有 Len 方法。
10. B
c <- 0 会阻塞依赖于 f() 的执行。
最后更新于