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)
}
相关推荐
Maiko Star11 小时前
Python核心语法——函数
开发语言·python
大气的小蜜蜂12 小时前
基于Python+Django的健身房管理系统实现:核心亮点全流程解析
开发语言·python·django
天空'之城12 小时前
Linux 系统编程 04:进程基础
linux·开发语言·进程基础
2zcode12 小时前
免费开源项目文档:基于MATLAB图像处理的药片检测与计数系统设计与实现
开发语言·图像处理·matlab
charlie11451419112 小时前
Cinux: 加载第一个内核:从 bootloader 跳进 C++
linux·开发语言·c++·嵌入式
. . . . .13 小时前
Egg框架深入
java·开发语言
C+-C资深大佬13 小时前
python while循环
服务器·开发语言·python
Tian_Hang13 小时前
eclipse ditto 学习笔记
运维·服务器·开发语言·javascript·3d
星夜夏空9913 小时前
C++学习(2) —— 类与对象基础
开发语言·c++·学习
倒流时光三十年14 小时前
Java 内存模型(JMM)通俗解释
java·开发语言