菜鸟要知道的「线程安全」 📅 发布时间:2026/7/7 5:48:17 👁️ 浏览次数: 菜鸟要知道的「线程安全」本文基于go技术栈进行解释相关概念及部分源码展示~✨线程安全是什么东西线程安全就是在多个线程并发操作同个资源的时候产生的数据始终一致。下面这个就是就是一个线程安全问题的例子var count int var wg sync.WaitGroup func main() { wg.Add(2) go func() { defer wg.Done(); for i : 0; i 1000; i { count } }() go func() { defer wg.Done(); for i : 0; i 1000; i { count } }() wg.Wait() fmt.Println(count) // 期望 2000实际可能是 1800、1950 等任意值 } //count 不是原子操作读 → 加1 → 写多个 goroutine 交错执行会导致丢失更新。解决办法有很多最常见的就是加锁同一时间只允许有一个线程可以对资源进行操作。详细的代码在此不再作再多展示因为我们本次的目的是研究为什么加锁可以保证线程安全✨为什么加锁可以保证线程安全?吾日三省吾身⚠️是什么决定了多线程会出现不安全的情况⚠️加锁实际上是如何保证线程安全⚠️加锁转成底层指令会是怎么样我们把问题拆解逐步分析再重新思考是什么决定了多线程会出现不安全的情况对资源的并发操作比如一个简单修改变量的操作转化成底层的汇编指令时会生成多个指令。汇编指令读取-计算-写入 0x0000 MOVQ .counter(SB), AX ; 读取当前值 0x0007 LEAQ 1(AX), CX ; 计算新值 (AX 1) 0x000b MOVQ CX, .counter(SB) ; 写回新值如果不加锁的情况下就会出现以下情况协程1协程2协程3读取a1读取a1读取a1a写入a2aa写入a2写入a2解决语言层面加入锁去确保多线程时同一时间只允许其中一个线程对资源进行内存可见性这里篇幅稍微涉及到的知识可能会稍微有点多请耐心阅读在多核CPU的架构下进程内的不同线程可能会被运行在不同的CPU核心中。N个核心就代表这个CPU可以同时运行N个线程。️ 现代计算机的存储层次结构从快到慢CPU 寄存器 ↓ L1 缓存每个核心私有1ns ↓ L2 缓存每个核心私有或共享3ns ↓ L3 缓存所有核心共享10ns ↓ 主存 RAM100ns ↓ 磁盘 / SSD看到这里就可以想到一个糟糕的事情线程A修改了变量a但是一般情况下为了加快执行效率CPU不会每次把数据写到L3或RAM中而是会先写入L2或L1缓存中然后发送失效广播给其他核心。不保证马上处理所以运行在其他核心的线程读取变量a时可能读到的是旧值或者新值。这会导致一个问题只有当前线程或执行在该核心的线程能保证百分百读到更新后的值。内存屏障这里引入了一个「内存屏障」的概念去解决内存可见性问题内存屏障是“同步指令”作用类似于操作数据库开始事务的命令执行了内存屏障指令后后续的指令会被内存屏障指令影响功能可以分为三点告诉 CPU“把你缓存里的脏数据刷到主存”告诉其他 CPU“我刚刚更新了数据A请把你们的数据A标记为过期”告诉编译器/CPU“别重排我屏障前后的代码”让更新了数据的CPU的脏数据刷到主存这里就是刚刚说到的CPU操作数据时不会直接把数据更新回主存而是直接操作CPU的三级缓存因为这样效率更高。最后如果缓存数据满了会采用淘汰算法把淘汰的脏数据刷回主存中。这里大家可能会有一个疑问❓为什么不直接更新到L3缓存就可以了反正L3是所有核心的共享缓存。现代的服务器一般都会有多个CPU插槽每个CPU之间的L3是不可以互相访问的所以要把更改的数据刷回主存才能让所有的CPU能找到最新的数据。我刚刚更新了数据A请把你们的数据A标记为过期当核心0修改了数据后并启用了内存屏障命令mov [x], 1 ; 写入 x 1先写入 Core0 的 store buffer / cache mfence ; 内存屏障缓存一致性协议如 MESI被触发Core 0 的缓存行状态变为Modified (M)如果其他核心如 Core 1的缓存中有x的副本状态为 Shared 或 InvalidCore 0 会广播 “Invalidate” 消息Core 1 收到 Invalidate 后将自己缓存中x的副本标记为Invalid (I)下次读x时发现缓存行无效 → 触发 cache miss → 从其他核心的缓存或主存加载最新值优先从其他核心读取。别重排我屏障前后的代码这里涉及到的是「指令重排」的问题因为一般情况下编译器会自己优化编排命令的执行顺序。a : true b : go func() { b msg a false }() for a { } println(b) //打印结果有可能为空 //原因:编译器对指令进行了优化重新编排bmsg被安排在afalse之后这里可以理解为晚上去大排档吃夜宵你点了一份炒面另外有两个客人点了两份炒粉。老板可能会优先把两份炒粉一起炒了先再安排炒面。但是老板也有可能是个守规矩的人先把你的炒面炒了再给其他两个客人炒粉。所以最终的结果取决于老板当时的想法。✨总结线程安全是什么确保多个线程访问同个资源最终结果的一致性。怎么保证线程安全加锁依赖内存屏障。保证同一资源同时操作的线程只有一个和解决「内存可见性」「指令重排问题
计算机毕业设计之jsp基于web的加油站管理系统 系统根据现有的管理模块进行开发和扩展,采用面向对象的开发的思想和结构化的开发方法对加油站管理的现状进行系统调查。采用结构化的分析设计,该方法要求结合一定的图表,在模块化的基础上进行系统的开发工作。在设计中采用“自下而上”的思想… 2026/7/3 3:52:08
计算机毕业设计之基于Python的高校新冠疫情防控信息管理系统 本系统为用户而设计制作高校新冠疫情防控信息管理系统,旨在实现高校新冠疫情防控信息智能化、现代化管理。本高校新冠疫情防控信息管理自动化系统的开发和研制的最终目的是将高校新冠疫情防控信息管理的运作模式从手工记录数据转变为网络信息查询管理,从… 2026/7/6 1:55:04
一文讲透|一键生成论文工具 千笔写作工具 VS 文途AI 本科生必备神器 随着人工智能技术的迅猛迭代与普及,AI辅助写作工具已逐步渗透到高校学术写作场景中,成为本科生完成毕业论文不可或缺的辅助手段。越来越多面临毕业论文压力的学生,开始依赖各类AI工具简化写作流程、提升创作效率。但与此同时,市场… 2026/7/7 5:33:30
AI动态叙事技术解析:从有限状态机到LLM的游戏革命 🚀 30款热门AI模型一站整合,DeepSeek/GLM/Qwen 随心用,限时 5 折。 👉 点击领海量免费额度 如果你是一名游戏开发者,最近可能被各种AI生成内容刷屏了。但今天要聊的《Unhinged》不太一样——它不是一个单纯展示技术… 2026/7/7 5:45:38
Fable 5被网友薅出省钱神招!最高减70%! 没想到,人类当年靠微缩打印做小抄的土办法,在大模型身上也照样管用。这两天,有位机智的老哥发现,只要把Fable 5的上下文转换成一张张密密麻麻写满文字的图片,再让模型通过OCR读回来,token输入成本最多能省下… 2026/7/7 5:41:36
章贡区新房装修找专业公司,真实使用体验到底怎么样? 家人们,咱就是说,新房装修真的太让人头大了!最近我在章贡区刚装修完新房,今天就来给大家分享一下我的真实体验,特别是和江西锦尚装饰合作的这段经历。 一开始,我真的被装修市场搞得晕头转向。很多装修公司报… 2026/7/7 5:35:35
ASM330LHH与PIC24HJ256GP610的高精度运动跟踪系统设计 1. 运动跟踪技术演进与ASM330LHH的革新价值在嵌入式系统领域,运动跟踪技术正经历从单一功能向高精度多维度感知的转变。ASM330LHH作为STMicroelectronics推出的6自由度惯性测量单元(6DoF IMU),将3轴数字加速度计和3轴数字陀螺仪集成在单一封装中… 2026/7/7 5:33:34
okbiye|告别开题摆烂!专属AI开题写作工具,适配全学段一键合规出稿 okbiye-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/科研绘图开题报告 - Okbiye智能写作https://www.okbiye.com/ai/ktbg 开题报告 - Okbiye智能写作 每一年的毕业开题季,都是无数大学生、硕博生的“难熬时刻”。不同于普通作业写作,开题… 2026/7/7 5:31:34
vs2026离线升级 1.背景 假如你的开发环境是在内网,由于vs版本太旧,需要升级,又无法联网,此时就需要做处理了,操作流程如下(vs2026已验证,其它版本) 2.升级流程 2.1 在可以联网的电脑制作vs2026离… 2026/7/7 5:31:34
Acunetix v24.8 深度解析:DAST漏洞扫描器核心原理与DevSecOps实践 1. 项目概述:Acunetix v24.8 高级版漏洞扫描器深度解析作为一名在网络安全领域摸爬滚打多年的老兵,我深知一款趁手的“兵器”对于安全测试工作意味着什么。今天要聊的,就是Web应用安全测试领域里一个响当当的名字——Acunetix。特别是其v24.8… 2026/7/7 0:01:11
如何3步搞定加密视频下载:跨平台资源嗅探与解密工具终极指南 如何3步搞定加密视频下载:跨平台资源嗅探与解密工具终极指南 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 你是… 2026/7/7 0:03:13
Jailhouse-gui可视化管理工具:让多核处理器分区变得简单高效 Jailhouse-gui可视化管理工具:让多核处理器分区变得简单高效 【免费下载链接】Jailhouse-gui A graphical user interface (GUI) tool for configuring and managing Jailhouse, a Linux-based hypervisor for partitioning multicore processors into isolated cel… 2026/7/7 0:03:13
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/6 8:43:22
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/6 7:29:49
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/6 7:29:51