golang 协程交替执行, 使其能顺序输出 1-20 的自然数
package main
import (
"fmt"
"sync/atomic"
"time"
)
func main() {
fmt.Println("----start----")
// golang 协程交替执行, 使其能顺序输出 1-20 的自然数
stoppedBy := make(chan int32)
var number int32
go func() {
for {
next := <-stoppedBy
fmt.Println("number", next)
// number++ 不是并发安全的 分为三步:读取变量值、加一、加一后的值重新赋值给原有变量 最终赋值前被并发读取后会产生数据不准确
// number++
if number == 20 {
return
}
atomic.AddInt32(&number, 1)
}
}()
go func() {
number++
for {
if number%2 == 0 {
continue
}
fmt.Println("number", number)
atomic.AddInt32(&number, 1)
stoppedBy <- number
if number == 20 {
return
}
}
}()
time.Sleep(2 * time.Second)
fmt.Println("----end----")
}