面试题答案
一键面试- 使用
sync.RWMutex
确保并发安全:- 在Go语言中,可以使用
sync.RWMutex
来保护map[int]string
。读操作可以并发进行,而写操作(包括写入新值和删除操作)需要独占锁。
package main import ( "fmt" "sync" ) var ( myMap = make(map[int]string) mu sync.RWMutex ) func read(key int) string { mu.RLock() defer mu.RUnlock() return myMap[key] } func write(key int, value string) { mu.Lock() defer mu.Unlock() myMap[key] = value } func deleteKey(key int) { mu.Lock() defer mu.Unlock() delete(myMap, key) }
- 在Go语言中,可以使用
- 处理删除操作时的同步问题:
- 在删除操作中,通过获取写锁(
mu.Lock()
)来确保在删除操作进行时,没有其他协程进行读写操作。这避免了在删除过程中其他协程读取到正在被删除的键值对,或者在删除时其他协程进行写入操作导致数据不一致。
- 在删除操作中,通过获取写锁(
- 对内存释放策略的影响:
- Go语言的垃圾回收(GC)机制会自动回收不再被引用的内存。当从
map
中删除一个键值对时,只要没有其他地方引用这个值(例如,没有在其他地方保留指向myMap
中某个值的指针),GC会在合适的时候回收这块内存。 - 使用
sync.RWMutex
虽然保证了并发安全,但并不会直接影响内存释放的时机。GC仍然基于其自身的算法和触发条件来回收内存。不过,由于锁的存在,可能会在一定程度上影响程序的整体性能,从而间接影响到GC触发的频率和时机。如果写操作(包括删除)频繁,可能会导致读操作等待,进而影响程序整体的运行效率,在一定程度上影响内存使用模式和GC的工作效率,但这是一个比较间接的影响。
- Go语言的垃圾回收(GC)机制会自动回收不再被引用的内存。当从