MST
星途 面试题库

面试题:Go语言中如何实现简单的线程安全Map

在Go语言中,原生的map不是线程安全的。请描述一种方法来实现一个线程安全的map,并简单说明实现思路,可结合sync包中的相关工具。
39.6万 热度难度
编程语言Go

知识考点

AI 面试

面试题答案

一键面试

实现方法

可以通过使用sync.Mutex来实现一个线程安全的map。示例代码如下:

package main

import (
    "fmt"
    "sync"
)

type SafeMap struct {
    mu sync.Mutex
    data map[string]interface{}
}

func NewSafeMap() *SafeMap {
    return &SafeMap{
        data: make(map[string]interface{}),
    }
}

func (sm *SafeMap) Set(key string, value interface{}) {
    sm.mu.Lock()
    defer sm.mu.Unlock()
    sm.data[key] = value
}

func (sm *SafeMap) Get(key string) (interface{}, bool) {
    sm.mu.Lock()
    defer sm.mu.Unlock()
    value, exists := sm.data[key]
    return value, exists
}

func (sm *SafeMap) Delete(key string) {
    sm.mu.Lock()
    defer sm.mu.Unlock()
    delete(sm.data, key)
}

实现思路

  1. 定义结构体:定义一个包含sync.Mutexmap的结构体SafeMapMutex用于保护map的操作,避免并发读写冲突。
  2. 初始化:在NewSafeMap函数中,初始化map
  3. 操作方法
    • Set方法:在设置map的键值对时,先通过mu.Lock()加锁,操作完成后通过defer mu.Unlock()解锁,确保同一时间只有一个协程能修改map
    • Get方法:获取map中值时同样加锁解锁,防止读取过程中map被修改。
    • Delete方法:删除map中键值对时也通过加锁解锁来保证线程安全。