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: 1

  • C: 一段时间后总是输出 #goroutines: 2

  • D: 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 中注释可以知道,读写锁当有一个协程在等待写锁时,其他协程是不能获得读锁的,而在AC中同一个调用链中间需要让出读锁,让写锁优先获取,而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() 的执行。

最后更新于