一道并发和锁的golang面试题

发布时间:2024-12-04 01:16:27

在golang开发领域中,掌握并发和锁是非常重要的。并发是指多个任务同时执行,而锁是为了避免数据竞争而引入的一种机制。在面试中经常会涉及到这方面的问题,下面我将通过一个具体的golang面试题来介绍并发和锁的相关知识。

题目描述

假设有一段代码如下:

var m = make(map[string]int)
var lock sync.RWMutex

func get(key string) int {
    lock.RLock()
    defer lock.RUnlock()
    return m[key]
}

func set(key string, value int) {
    lock.Lock()
    defer lock.Unlock()
    m[key] = value
}

问题分析

上述代码中,有一个全局变量m和一个全局锁lock。get函数用来获取map中指定键的值,set函数用来设置map中指定键的值。现在请你回答以下几个问题:

问题一:为什么需要引入锁?

在并发操作中,多个goroutine可能同时读写共享的数据,如果不加以控制,就会产生数据竞争的问题,导致程序的行为不可预测。因此,我们需要引入锁来保证共享数据的一致性。

问题二:为什么用读写锁(sync.RWMutex)而不是普通锁(sync.Mutex)?

在get函数中,我们使用了lock.RLock()来获取读锁,而在set函数中,我们使用了lock.Lock()来获取写锁。使用读写锁可以在保证数据一致性的前提下,提高并发读取的效率。

问题三:defer lock.Unlock()中的defer关键字的作用是什么?

defer关键字用来延迟执行函数调用,可以将某个函数调用放到函数执行结束时才执行。在set函数中,我们使用defer lock.Unlock()来确保在函数执行结束后一定会释放写锁,避免出现死锁的情况。

通过以上分析,我们可以看出并发和锁在golang开发中的重要性,以及为什么需要使用读写锁来提高并发效率。希望这篇文章能对你理解并发和锁在golang中的应用有所帮助。在实际开发中,合理地使用并发机制和锁是必要的,以提高程序的性能和正确性。

相关推荐