MST
星途 面试题库

面试题:Go语言Map删除操作与并发安全

假设有一个多协程环境,多个协程会同时对一个 `map[int]string` 类型的变量 `myMap` 进行读写和删除操作。请设计一个方案来确保这些操作的并发安全,说明如何处理删除操作时的同步问题,以及这样做对内存释放策略可能产生的影响。
37.7万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试
  1. 使用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)
    }
    
  2. 处理删除操作时的同步问题
    • 在删除操作中,通过获取写锁(mu.Lock())来确保在删除操作进行时,没有其他协程进行读写操作。这避免了在删除过程中其他协程读取到正在被删除的键值对,或者在删除时其他协程进行写入操作导致数据不一致。
  3. 对内存释放策略的影响
    • Go语言的垃圾回收(GC)机制会自动回收不再被引用的内存。当从map中删除一个键值对时,只要没有其他地方引用这个值(例如,没有在其他地方保留指向myMap中某个值的指针),GC会在合适的时候回收这块内存。
    • 使用sync.RWMutex虽然保证了并发安全,但并不会直接影响内存释放的时机。GC仍然基于其自身的算法和触发条件来回收内存。不过,由于锁的存在,可能会在一定程度上影响程序的整体性能,从而间接影响到GC触发的频率和时机。如果写操作(包括删除)频繁,可能会导致读操作等待,进而影响程序整体的运行效率,在一定程度上影响内存使用模式和GC的工作效率,但这是一个比较间接的影响。