news 2026/5/26 2:34:36

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
多线程循环打印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的情况
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/25 9:02:28

HTML奇妙冒险第一关:从零开始的网页构建之旅

本文将主要梳理html网页布局的基础知识与常用标签以及注意事项&#xff0c;对于软件的选用与课外知识不加涉猎 文章目录一、HTML的基本结构标签二、常用的HTML标签与必要的基本知识点1、基础知识之标签结构说明&#xff1a;2、基础知识之属性特性说明&#xff1a;3、常用标签1.…

作者头像 李华
网站建设 2026/5/26 6:34:31

QGIS open sans font安装失败

设置一下就可以了 打开QGIS&#xff0c;选择设置选择选项选择 字体上图红框勾选去掉即可

作者头像 李华
网站建设 2026/5/26 6:31:46

【单片机毕业设计】【mcugc-mcu912】基于单片机的智能饮水机

一、基本介绍 功能&#xff1a; 1、通过一个按键模拟加热电源的开关 2、通过防水式DS18B20检测水温&#xff0c;当电源打开时&#xff0c;温度小于设置最小值&#xff0c;进行自动加热&#xff0c;直到加热到最大值时停止&#xff1b; 3、通过三个LED灯显示当前状态&#xff0c…

作者头像 李华
网站建设 2026/5/26 6:33:35

JoyAgent-JDGenie系统架构设计

系统架构设计 📌 查看流程图说明 本文档使用 Mermaid 语法绘制流程图。如果流程图无法正常显示,请使用以下方式查看: VS Code: 安装 “Markdown Preview Mermaid Support” 扩展 GitHub/GitLab: 直接查看,自动支持 Mermaid 在线编辑器: 访问 Mermaid Live Editor 复制代码…

作者头像 李华
网站建设 2026/5/25 8:41:02

关于javaSE异常的处理(看这一篇就够了)

目录 一、异常是什么 1.异常的概念 2.异常的分类 二、异常的处理 1.防御式编程 2.&#xff08;异常的抛出&#xff09;throw的使用 3.异常的声明-throws 4.捕获异常-try-catch捕获并处理异常 5.finally关键字起到 三、异常的处理流程 四、总结 一、异常是什么 1.异常…

作者头像 李华