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

多线程循环打印123(个人题解golang版)

刷面筋看到这么一道手搓题,看网上题解大部分都是java的,就以我的理解用go实现了(ai好笨啊,也可能是我不会用,问的全是错的最后还得自己手搓),纯古法手搓版:

var num atomic.Int64 // num 维护输出的数字 var count int // count 打印的组数 var lock sync.Mutex // lock 并发锁,保证每次只有一个协程去拿num防止出现并发冲突 func main() { num.Store(1) group := sync.WaitGroup{} group.Add(3) // 打印 1 go func() { for count < 100 { lock.Lock() // 这里必须重新判断一下count是否还<100 // 因为在并发条件下,可能出现count==99是协程一进入循环,但此时协程三拿到锁在操作,把count更新为100 // 此时协程一就不应该打印了,但因为进入了循环又没有限制还是会打印,在某些情况下就会出现多打印一次协程1和2的情况 if count < 100 && num.CompareAndSwap(1, 2) { fmt.Println(1) } lock.Unlock() } group.Done() }() // 打印 2 go func() { for count < 100 { lock.Lock() if count < 100 && num.CompareAndSwap(2, 3) { fmt.Println(2) } lock.Unlock() } group.Done() }() // 打印 3 go func() { for count < 100 { lock.Lock() if count < 100 && num.CompareAndSwap(3, 1) { fmt.Println(3) // 到协程3,一组循环才算结束才count+1 count++ } lock.Unlock() } group.Done() }() // 阻塞等待 group.Wait() }

这里有几点我实现时踩过的坑大家可以注意一下:

  1. 一定要加锁,即使使用atomic也只是维护了一个变量的并发而非整个代码块,同时因为这里不是变量层面的并发,所以这里也可以用普通int替代,这里我num使用了atomic是为了简化代码利用它内置的CompareAndSwap方法,大家自己实现可以直接使用int
  2. 锁里面一定要再次判断count,因为在并发条件下,可能出现count==99是协程一进入循环,但此时协程三拿到锁在操作,把count更新为100,此时协程一就不应该打印了,但因为进入了循环又没有限制还是会打印,在某些情况下就会出现多打印一次协程1和2的情况
http://www.cnnetsun.cn/news/52248.html

相关文章:

  • 全面沦陷:所有 LLM 与 AI 绘画模型已被攻破——红队实战全景报告(2025)
  • systemd服务管理深入实践从入门到自定义服务
  • 基于微信小程序的网络安全知识科普平台系统【源码文末联系】
  • 基于VUE的实验室使用管理系统[VUE]-计算机毕业设计源码+LW文档
  • 【单片机毕业设计】【mcugc-mcu911】基于单片机的多功能安防系统
  • 【单片机毕业设计】【mcugc-mcu916】基于单片机的智能家居安防系统
  • 基于vue的家庭服务预约管理系统的设计与实现_f1709smp_springboot php python nodejs
  • Java---小球移动案例(附代码)
  • 分享一个夸克网盘不限速的下载方法-在线免费工具
  • 1、现代 C++ 挑战:从基础到实战
  • 当数据回归遇上暴击流:SVM Adaboost实战手札
  • 65、文件管理子系统与网络协议通信概述
  • DAY18 机器学习
  • jd.item_review获取京东商品评论 及tb.item_review获取taobao商品评论
  • Windows11系统文件verifier.dll丢失或损坏问题 下载修复
  • C++树形数据结构————树状数组、线段树中“逆序对”的问题
  • 2025年B站视频下载终极指南:bilili工具完整使用教程
  • 教程 32 - 几何体系统
  • Cursor高级技巧与最佳实践
  • Cursor + MCP:冲击的不仅是前端,而是整个软件开发范式!
  • 2025年十大旗舰对决:极致轻薄成高端手机新战场
  • 【Vue3】 中 ref 与 reactive:状态与模型的深入理解
  • 毕设 stm32 RFID员工打卡门禁系统(源码+硬件+论文)
  • 全球最大、最领先的吉利全球全域安全中心正式发布
  • Android中Compose系列之按钮Button
  • wangEditor导入excel数据到html富文本编辑
  • 光伏电池simulink仿真模型 光伏电池建模仿真 包括改变温度 改变辐照度的特性分析 模型可...
  • JSP中如何利用分块技术实现百万文件上传优化?
  • 60、Ubuntu 安装硬件规划全攻略
  • 2025年12月— CET四六级答案