Golang中的指针与并发编程_Golang指针与并发安全操作分析-Golang

直接传指针进goroutine易出错,因循环变量复用导致所有goroutine共享同一地址;sync.Mutex不保护指针本身而只保护临界区内的解引用操作;unsafe.Pointer绕过GC跟踪易致悬垂指针;channel传指针需明确所有权与生命周期。

为什么直接传指针进 goroutine 容易出错

因为 goroutine 启动是异步的,如果循环中用 &v 取地址并启动 goroutine,所有 goroutine 最终可能都指向同一个内存地址(即循环变量 v 的最后一轮值)。

  • 典型现象:for _, v := range items { go func() { fmt.Println(v) }() } 输出全是最后一个 v
  • 根本原因:Go 中 range 复用循环变量,&v 总是取同一块栈地址
  • 修复方式:在循环体内显式拷贝变量,比如 go func(val int) { fmt.Println(val) }(v),或用局部变量 val := v; go func() { ... }(val)
  • 注意:即使传的是结构体指针,只要它指向的是循环内反复赋值的变量,问题依旧存在

sync.Mutex 保护指针所指向的数据,不是保护指针本身

指针变量本身是可复制的,sync.Mutex 不能靠“锁住指针”来保证并发安全;必须确保所有对指针所指向内存的读写,都在临界区内完成。

  • 错误写法:var p *int; mu.Lock(); p = &x; mu.Unlock() —— 这只锁了赋值动作,后续通过 p 读写仍不安全
  • 正确做法:把所有解引用操作(*p)包进 mu.Lock()/Unlock() 区间
  • 常见陷阱:把 mutex 放在结构体里但没导出,外部无法调用 Lock();或误以为 “指针+mutex 字段” 就自动线程安全
  • 性能提示:避免在 hot path 中频繁加锁解引用;考虑用 sync/atomic 操作简单类型(如 *int32),但仅限原子读写,不支持复合操作

unsafe.Pointer 转换指针类型时丢失类型安全与 GC 可见性

在并发场景下混用 unsafe.Pointer 和普通指针,容易导致 GC 误判对象存活状态,引发悬垂指针或提前回收。

  • 典型错误:p := &x; up := unsafe.Pointer(p); ... go func() { *(*int)(up) = 42 }() —— 若 x 是局部变量且函数已返回,up 指向的内存可能被回收
  • GC 不跟踪 unsafe.Pointer,也不会将其视为根对象;一旦没有其他 Go 指针指向该内存,就可能被清理
  • 并发下更危险:一个 goroutine 正在用 unsafe 访存,另一个触发 GC,且无强引用维持对象生命周期
  • 替代方案:优先用 sync.Pool 管理临时对象;必须用 unsafe 时,确保原始 Go 指针在整个使用周期内持续存活(例如全局变量、堆分配对象)

channel 传递指针需明确所有权和生命周期边界

通过 channel 发送指针,本质是传递内存地址,接收方获得的是同一份数据的访问权。谁负责释放?是否允许并发读写?必须由设计者约定清楚。

夏夕资源网专注于CMS网站模板,主流语言整站网站源码下载,网站建设相关教程分享,好用的软件素材整合下载,提供一站式便捷自助服务。
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需!
7. 如遇到加密压缩包,默认解压密码为"zy.lucklyus.top",如遇到无法解压的请联系管理员!
夏夕资源网-网站模板_免费源码_资源素材 » Golang中的指针与并发编程_Golang指针与并发安全操作分析-Golang
在线时间:12:00 - 22:00
关注微信公众号:微信公众号
站长邮箱:[email protected]
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4001317+
  • 本周更新: 0+
  • 最后更新: 2026-03-16

本站指数

×
  • 运营天数: 1392+
  • 资源总数: 47989+
  • 用户总数: 1+
  • 今日更新: 0+
  • 访问次数: 4001317+
  • 本周更新: 0+
  • 最后更新: 2026-03-16