面试题答案
一键面试- 问题:
increment
函数中没有解锁操作。当调用mu.Lock()
后,没有对应的mu.Unlock()
,这会导致其他试图获取该锁的goroutine永远阻塞。
- 原因:
- 在Go语言中,使用
sync.Mutex
进行同步时,Lock
和Unlock
操作必须成对出现。这里increment
函数在counter++
操作后没有调用mu.Unlock()
,使得后续的goroutine调用mu.Lock()
时会一直等待锁的释放,从而造成死锁(当其他goroutine需要这个锁才能继续执行时)。正确的做法应该是在counter++
操作后调用mu.Unlock()
,为了确保在函数返回时总是能解锁,通常使用defer mu.Unlock()
,即在mu.Lock()
后马上使用defer mu.Unlock()
,这样无论函数以何种方式返回,锁都会被正确释放。修改后的increment
函数如下:
- 在Go语言中,使用
func increment() {
mu.Lock()
defer mu.Unlock()
counter++
}