思路: 利用原子性操作,實現一個自旋鎖.實現多協程順序打印數字
import (
"fmt"
"sync/atomic"
"time"
)
//原子操作的變量.
var Count int32
//實現一個自旋鎖操作.
func SpinLock(i int32, fn func()) {
for { //一個死循環.
//查看原子操作的值.如果相等則執行函數
if n := atomic.LoadInt32(&Count); n == i {
fn()
atomic.AddInt32(&Count, 1) //然后原子操作自增.
break //一定要跳出循環.
}
time.Sleep(time.Nanosecond)
}
}
func main() {
for i := int32(0); i < 10; i ++ {
go func(i int32) {
fn := func() {
fmt.Println(i)
}
SpinLock(i, fn)
}(i)
}
//當原子操作自增count = 10就結束操作, 也可以睡一會兒
SpinLock(10, func() {})
}