golang 一种并发安全 map 的实现

在 Go 语言的并发编程场景中,标准库中的map类型并不是并发安全的。当多个 goroutine 同时对map进行读写操作时,很容易引发竞态条件(race condition),导致程序出现不可预测的错误。为了解决这一问题,我们可以通过自定义结构体,结合读写锁来实现一个并发安全的map,本文就来详细介绍一种安全map的实现方法。​

代码实现​

Go 复制代码
package main

import (
	"sync"
)

type safeMap struct {
	lock *sync.RWMutex
	sm   map[interface{}]interface{}
}

func newSafeMap() *safeMap {
	return &safeMap{
		lock: new(sync.RWMutex),
		sm:   make(map[interface{}]interface{}),
	}
}

func (m *safeMap) Get(k interface{}) interface{} {
	m.lock.RLock()
	defer m.lock.RUnlock()
	if val, ok := m.sm[k]; ok {
		return val
	}
	return nil
}

func (m *safeMap) Set(k interface{}, v interface{}) bool {
	m.lock.Lock()
	defer m.lock.Unlock()
	if val, ok := m.sm[k]; !ok {
		m.sm[k] = v
	} else if val != v {
		m.sm[k] = v
	} else {
		return false
	}
	return true
}

func (m *safeMap) Check(k interface{}) bool {
	m.lock.RLock()
	defer m.lock.RUnlock()
	if _, ok := m.sm[k]; !ok {
		return false
	}
	return true
}

func (m *safeMap) Delete(k interface{}) {
	m.lock.Lock()
	defer m.lock.Unlock()
	delete(m.sm, k)
}
相关推荐
学掌门17 分钟前
用Python做数据分析之数据处理及数据提取
开发语言·python·数据分析
钢铁男儿37 分钟前
C#结构体性能暴击指南:从内存陷阱到零损耗实战
开发语言·c#
LZA1851 小时前
C语言——结构体
c语言·开发语言·数据结构
阿杰学编程1 小时前
Go 语言中的条件判断和for 循环
java·数据库·golang
小白学大数据1 小时前
Python爬取豆瓣短评并生成词云分析
开发语言·python
虾球xz1 小时前
CppCon 2016 学习:Parallelism in Modern C++
开发语言·c++·学习
MZZ骏马1 小时前
C#接受文件
开发语言·c#
努力学习的明2 小时前
MQ解决高并发下订单问题,实现流量削峰
开发语言·后端·并发·mq
BMW_i82 小时前
C++---类和对象(中)
开发语言·c++
ZHPEN12 小时前
python打卡day52
开发语言·python