一、并发使用原则与技术挑战
核心准则
- 安全优先:Go并发编程的首要前提是保障并发安全(thread safety)
- 模式后选:在安全基础上选择具体并发模式(锁/通道/原子操作等)
典型困惑

二、错误示例分析与改进方案
案例需求
通过3个goroutine严格循环输出:G1: Hello → G2: Concurrency → G3: in Go!
▶ 错误方案1:互斥锁误用

乍一看,这没有什么问题,其实在并发过程中并不能严格保证执行顺序,这在生产过程中是有风险的。
问题分析:
- 随机唤醒:虽然锁保证了互斥,但无法控制goroutine获取锁的顺序
- CPU空转:持续循环检查造成资源浪费
有童鞋就要问了,我在执行过程中并没有发现有不妥的地方啊,问题在哪呢?
尽管协程是序列化的使用的锁,但是他们获取锁依然是随机的
这就是协程调度机制决定的:
- 协程是由go runtime计划调度的,并非是按照他们创建的顺序
- Mutex的方式虽然能防止协程同时进行,但是他并不能强制执行(1 → 2 → 3 → 1 → 2 → 3).的顺序
▶ 错误方案2:原子操作误用

执行结果可能:

为什么会出现这样的情况
·"Goroutine 1: Hello" 出现了3次是因为每个协程都独立的读取到n=0并在
更新n值之前输出
三、正确方案:通道接力控制法
实现原理


以上就是今天要讨论的问题,请大家注意示例2的time,sleep(),为什么要在这里使用,我先挖个坑,当然,上面的方法仅仅是抛砖引玉,也请大佬斧正!
785

被折叠的 条评论
为什么被折叠?



