当前位置: 首页 > news >正文

【Golang】Golang的Map的线程安全问题

文章目录

  • 前言
  • 一、场景介绍
  • 二、线程安全的Map的使用
  • 四、总结


前言

在 Golang 编程中,map 是一种常用的数据结构,用于存储键值对。然而,Golang 的 map 在并发访问时是线程不安全的。如果多个 goroutine 同时读写同一个 map,可能会导致数据竞争和程序崩溃。本文将详细介绍 Golang 中 map 的线程不安全性,并提供一些解决方案,帮助开发者在并发编程中正确使用 map。


一、场景介绍

1. 什么是线程不安全
线程不安全是指在多线程(或多 goroutine)环境下,多个线程同时访问和修改共享数据时,可能会导致数据不一致或程序崩溃。对于 Golang 的 map 来说,如果没有适当的同步机制,多个 goroutine 同时读写同一个 map 就会出现这种情况。

2. map 是线程不安全的
在同一时间点,两个 goroutine 对同一个 map 进行读写操作是不安全的。举个例子:

某 map 桶数量为 4,即 B=2。此时 goroutine1 来插入 key1,goroutine2 来读取 key2。可能会发生如下过程:

  • 1.goroutine2 计算 key2 的 hash 值,B=2,并确定桶号为 1。
  • 2.goroutine1 添加 key1,触发扩容条件。
  • 3.B=B+1=3,buckets 数据迁移到 oldbuckets。
  • 4.goroutine2 从桶 1 中遍历,获取数据失败。

3. 线程不安全的示例
以下是一个简单的示例,展示了在没有同步机制的情况下,多个 goroutine 同时读写 map 可能导致的错误:

package mainimport ("fmt""sync"
)func main() {m := make(map[int]int)var wg sync.WaitGroupfor i := 0; i < 10; i++ {wg.Add(1)go func(i int) {defer wg.Done()m[i] = i}(i)}wg.Wait()fmt.Println(m)
}

二、线程安全的Map的使用

1. 使用 sync.Mutex 进行同步

为了避免数据竞争,可以使用 sync.Mutex 进行同步。sync.Mutex 提供了锁机制,确保同一时刻只有一个 goroutine 可以访问 map。

示例:

package mainimport ("fmt""sync"
)func main() {m := make(map[int]int)var mu sync.Mutexvar wg sync.WaitGroupfor i := 0; i < 10; i++ {wg.Add(1)go func(i int) {defer wg.Done()mu.Lock()m[i] = imu.Unlock()}(i)}wg.Wait()fmt.Println(m)
}

在这个示例中,使用 mu.Lock() 和 mu.Unlock() 确保每次只有一个 goroutine 可以访问 map,从而避免数据竞争。

2. 使用 sync.RWMutex 进行读写锁

如果读操作远多于写操作,可以使用 sync.RWMutex 进行读写锁。sync.RWMutex 提供了读锁和写锁,允许多个 goroutine 同时进行读操作,但写操作仍然是互斥的。

示例:

package mainimport ("fmt""sync"
)func main() {m := make(map[int]int)var mu sync.RWMutexvar wg sync.WaitGroupfor i := 0; i < 10; i++ {wg.Add(1)go func(i int) {defer wg.Done()mu.Lock()m[i] = imu.Unlock()}(i)}for i := 0; i < 10; i++ {wg.Add(1)go func(i int) {defer wg.Done()mu.RLock()fmt.Println(m[i])mu.RUnlock()}(i)}wg.Wait()
}

在这个示例中,使用 mu.RLock() 和 mu.RUnlock() 进行读操作,使用 mu.Lock() 和 mu.Unlock() 进行写操作,从而提高并发读的效率。

3. 使用 sync.Map

Golang 标准库提供了 sync.Map,它是一个并发安全的 map 实现,适用于需要高并发访问的场景。sync.Map 提供了原子操作,避免了手动加锁的复杂性。

示例:

package mainimport ("fmt""sync"
)func main() {var m sync.Mapvar wg sync.WaitGroupfor i := 0; i < 10; i++ {wg.Add(1)go func(i int) {defer wg.Done()m.Store(i, i)}(i)}for i := 0; i < 10; i++ {wg.Add(1)go func(i int) {defer wg.Done()value, _ := m.Load(i)fmt.Println(value)}(i)}wg.Wait()
}

在这个示例中,使用 m.Store() 进行写操作,使用 m.Load() 进行读操作,sync.Map 内部已经实现了并发安全。

四、总结

Golang 中的 map 在并发访问时是线程不安全的,如果不加以同步处理,可能会导致数据竞争和程序崩溃。本文介绍了几种解决方案,包括使用 sync.Mutex、sync.RWMutex 和 sync.Map。希望通过本文的介绍,读者能够更好地理解 Golang 中 map 的线程不安全性,并在实际项目中正确使用 map 进行并发编程。

相关文章:

【Golang】Golang的Map的线程安全问题

文章目录 前言一、场景介绍二、线程安全的Map的使用四、总结 前言 在 Golang 编程中&#xff0c;map 是一种常用的数据结构&#xff0c;用于存储键值对。然而&#xff0c;Golang 的 map 在并发访问时是线程不安全的。如果多个 goroutine 同时读写同一个 map&#xff0c;可能会…...

指向指针的指针+ 值传递的理解

//17、下面的程序会出现什么结果 #include #include void getmemory(char *p) { p(char *) malloc(100); strcpy(p,”hello world”); } int main( ) { char *strNULL; getmemory(str); printf(“%s/n”,str); free(str); return 0; } // 程序崩溃&#xff0c…...

CSS常用定位

一、relative 相对原先的位置进行定位 {position: relative;left: 50px; /* 相对原先位置左边的距离 */top: 100px; /* 相对原先位置上边的距离 */ } 二、absolute 绝对定位&#xff0c;是相对于最近有定位的父级元素进行定位 {position: absolute;righ…...

【Linux】从零开始使用多路转接IO --- select

碌碌无为&#xff0c;则余生太长&#xff1b; 欲有所为&#xff0c;则人生苦短。 --- 中岛敦 《山月记》--- 从零开始认识五种IO模型 1 前言2 认识多路转接select3 多路转接select等待连接4 完善代码5 总结 1 前言 上一篇文章我们讲解了五种IO模型的基本概念&#xff0c;并…...

ArcGIS Pro SDK (二十一)渲染

ArcGIS Pro SDK (二十一)渲染 文章目录 ArcGIS Pro SDK (二十一)渲染1 定义唯一值呈现器定义2 为最新观测值设置唯一值渲染器3 为先前的观测值设置唯一值渲染器4 设置简单的渲染器以绘制轨迹线5 检查先前的观测值和轨道线可见性6 使轨迹线和先前的观测点可见7 检索当前观测…...

FPGA在物联网边缘计算中的应用!!!

FPGA&#xff08;现场可编程门阵列&#xff09;在物联网边缘计算中的应用正变得越来越重要。边缘计算是一种分布式计算架构&#xff0c;它将数据的处理分散到网络的边缘&#xff0c;靠近数据源&#xff0c;而不是集中在数据中心处理。以下是FPGA在物联网边缘计算中的几个关键应…...

【解决】Linux环境中mysqlclient安装失败问题

问题描述 在Linux系统下安装myslclient报异常。系统为Centos 8 使用 pip install mysqlclient 报出下面的异常 error: subprocess-exited-with-error Getting requirements to build wheel did not run successfully.│ exit code: 1╰─> [30 lines of output]/bin/sh: pkg…...

✨ Midjourney中文版:创意启航,绘梦无界 ✨

Midjourney AI超强绘画 (原生态系统&#xff09;用户端&#xff1a;Ai Loadinghttps://www.mjdiscord.com 项目详细介绍飞书文档&#xff1a;Docshttps://ivqklkndl4k.feishu.cn/docx/GRnMdCbcooWkwTx1RU4cZjGVnzb?fromfrom_copylk &#x1f310; 无缝体验&#xff0c;中文定制…...

软件(1)

软件 常考软件 图像软件 Flash 一款二维动画处理软件 photoshop 图像处理界的“巨无霸” ACDSee ACDSee是常用的图片管理编辑软件&#xff0c;尽管也可以支持WAV格式的音频播放&#xff0c; 但目前主要是作为看图软件 音频软件 Winamp Winamp是数字媒体播放的先驱Audition Audi…...

linux perf 环境部署和基本测试(基于Ubuntu20.04)

1,linux 安装perf sudo apt-ge install linux-tools-common sudo apt-get install linux-tools-$(uname -r) linux-tools-generic -y 2 补充安装 sudo apt-get install python3-q-text-as-data 3&#xff0c;perf常用命令 larkubuntu:~$ perf usage: perf [--version] [--hel…...

【网络面试篇】HTTP(1)(笔记)——状态码、字段、GET、POST、缓存

目录 一、相关问题 1. HTTP请求常见的状态码和字段&#xff1f; &#xff08;1&#xff09;状态码 &#xff08;2&#xff09;字段 ① Host 字段 ② Content-length 字段 ③ Connection 字段 ④ Content-Type 字段 ⑤ Content-Encoding 字段 2. GET 和 POST 的区别&a…...

HTML 基础标签——分组标签 <div>、<span> 和基础语义容器

文章目录 1. `<div>` 标签特点用途示例2. `<span>` 标签特点用途示例3. `<fieldset>` 标签特点用途示例4. `<section>` 标签特点用途示例5. `<article>` 标签特点用途示例总结HTML中的分组(容器)标签用于结构化内容,将页面元素组织成逻辑区域…...

SS928V100 ISP常见问题列表

下载链接&#xff1a; https://download.csdn.net/download/quantum7/89948226 1 FAQ 1 1.1 ISP 1 1.1.1 如何解决整体锐度不足 1 1.1.2 如何解决图像发蒙问题&#xff0c;提高通透性 2 1.1.3 如何解决低照度清晰度差 2 1.1.4 如何解决图像清晰度与物体边缘白边和黑边问题…...

AI写诗:自动版大唐宫体诗

大唐学子&#xff0c;手拿一本小卷&#xff08;类书&#xff09;&#xff0c;从中挑选过去他们&#xff08;权威&#xff09;认为好的词来拼接一首诗&#xff0c;此类诗词称作“宫体诗”&#xff0c;在初唐时期甚是流行。 写“宫体诗”的过程有木有那么一丝丝的熟悉&#xff1f…...

Java复习31(PTA)

sdust-Java-字符串集合求并集 分数 15 全屏浏览 切换布局 作者 张峰 单位 山东科技大学 从键盘接收N个英文字符串&#xff08;其中不同的字符串数量大于10&#xff09;&#xff0c;从头开始取5个不同的字符串放入一个集合S1&#xff0c;然后接着取5个不同的字符串放入另一个…...

【Linux系列】Linux 系统中的软连接管理

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

@layer(级联层)

在css样式表(文件)中声明layer为样式添加级联层,其意义在于可以使用它重新定义样式的叠层关系. layer后声明的级联层里面的样式将覆盖前声明的级联层里面的相同属性.在级联层外声明的样式会覆盖级联层里面的相同属性样式,同一层级里面的样式冲突,依然按照优先级来计算. 在级联层…...

nginx代理websocket服务

一、nginx代理websocket服务 一&#xff09;nginx代理ws服务 在nginx中&#xff0c;可以通过proxy_pass指令来代理WebSocket服务。 以下是一个示例配置&#xff1a; map $http_upgrade $connection_upgrade {default upgrade; close; }upstream ws_backend {server 127.0.0.1:…...

第二十七章 Vue异步更新之$nextTick

目录 一、概述 二、完整代码 2.1. main.js 2.2. App.vue 一、概述 需求&#xff1a;编辑标题, 弹出显示编辑框自动聚焦 1. 点击编辑&#xff0c;显示编辑框 2. 让编辑框&#xff0c;立刻获取焦点 我们常规的思路可能会编写如下代码来实现&#xff1a; 问题&#xff1a…...

【51 Pandas+Pyecharts | 深圳市共享单车数据分析可视化】

文章目录 &#x1f3f3;️‍&#x1f308; 1. 导入模块&#x1f3f3;️‍&#x1f308; 2. Pandas数据处理2.1 读取数据2.2 查看数据信息2.3 处理起始时间、结束时间2.4 增加骑行时长区间列2.5 增加骑行里程区间列 &#x1f3f3;️‍&#x1f308; 3. Pyecharts数据可视化3.1 各…...

vLLM-v0.17.1部署实战教程:3步启用OpenAI兼容API服务

vLLM-v0.17.1部署实战教程&#xff1a;3步启用OpenAI兼容API服务 1. vLLM框架简介 vLLM是一个专为大型语言模型(LLM)设计的高性能推理和服务库&#xff0c;以其出色的速度和易用性著称。这个项目最初由加州大学伯克利分校的天空计算实验室开发&#xff0c;现在已经发展成为一…...

M1 Mac 8GB内存跑不动7B模型?手把手教你用1.5B版DeepSeek+RAGFlow搭建个人知识库

M1 Mac 8GB内存跑不动7B模型&#xff1f;手把手教你用1.5B版DeepSeekRAGFlow搭建个人知识库 当M1 Mac用户尝试在本地部署大语言模型时&#xff0c;8GB内存往往成为难以逾越的障碍。特别是运行7B参数模型时&#xff0c;内存不足导致的崩溃和卡顿让许多开发者望而却步。本文将分…...

手把手教你用ENA-TDR实测USB3.0线:阻抗、延时、串扰一个不漏

深度解析USB3.0线缆全参数测试&#xff1a;从TDR原理到实战报告解读 在高速数据传输领域&#xff0c;一根优质USB3.0线缆的价值往往被严重低估。当工程师们为系统稳定性问题焦头烂额时&#xff0c;很少有人会想到问题可能出在那根不起眼的连接线上。事实上&#xff0c;根据行业…...

nli-distilroberta-base参数解析与调优指南:关键配置项详解

nli-distilroberta-base参数解析与调优指南&#xff1a;关键配置项详解 1. 引言 如果你正在使用nli-distilroberta-base模型进行自然语言推理任务&#xff0c;可能会遇到这样的困惑&#xff1a;为什么同样的模型在不同机器上运行速度差异这么大&#xff1f;为什么有时候推理结…...

别再手动改配置了!用Docker Compose一键部署Pikachu靶场,5分钟搞定测试环境

5分钟极速搭建Pikachu靶场&#xff1a;Docker Compose自动化实战指南 每次准备网络安全练习环境时&#xff0c;最头疼的莫过于反复安装配置各种服务——PHP版本不兼容、MySQL连接失败、Web服务器配置错误...这些琐碎问题消耗了本应用于渗透测试学习的宝贵时间。今天要分享的这套…...

护士执业资格考试历年真题及答案解析电子版PDF(2011-2025年)

2026年护士执业资格考试时间为2026年4月11-12日。‌‌为助力广大考生高效备考&#xff0c;小编精心整理了涵盖2011年至2025年的护士执业资格考试真题试卷及详细答案解析&#xff0c;包含《专业实务》和《实践能力》&#xff0c;高清PDF电子版&#xff0c;可打印&#xff0c;方便…...

stealth.js全解析:40+反检测补丁的配置与优化技巧

Stealth.js全解析&#xff1a;40反检测补丁的配置与优化技巧 在当今的Web自动化领域&#xff0c;反检测技术已成为开发者必须掌握的核心技能之一。无论是数据采集、自动化测试还是其他需要模拟真实用户行为的场景&#xff0c;如何让脚本"隐形"都是决定成败的关键因素…...

WindowsCleaner:3个步骤解决C盘爆红问题的终极指南

WindowsCleaner&#xff1a;3个步骤解决C盘爆红问题的终极指南 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服&#xff01; 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 你是否也经历过C盘突然变红、系统卡顿不堪的困扰&a…...

别再只会用高德百度了!这7种专业地图(附GIS工具推荐)帮你搞定数据分析

7种专业地图与GIS工具实战指南&#xff1a;从用户分布到物流优化的全场景解决方案 打开手机地图应用查看路线&#xff0c;可能是大多数人对地理数据的唯一接触。但当你需要分析千万级用户的区域活跃度、规划全国物流网络或评估新店选址时&#xff0c;高德百度提供的标准化地图就…...

突破百度网盘限速难题:非会员高速下载的技术实现与实战指南

突破百度网盘限速难题&#xff1a;非会员高速下载的技术实现与实战指南 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 当你急需下载一份600MB的项目资料&#xff0c;却发现百…...