思路: 利用原子性操作,實(shí)現(xiàn)一個(gè)自旋鎖.實(shí)現(xiàn)多協(xié)程順序打印數(shù)字
import (
"fmt"
"sync/atomic"
"time"
)
//原子操作的變量.
var Count int32
//實(shí)現(xiàn)一個(gè)自旋鎖操作.
func SpinLock(i int32, fn func()) {
for { //一個(gè)死循環(huán).
//查看原子操作的值.如果相等則執(zhí)行函數(shù)
if n := atomic.LoadInt32(&Count); n == i {
fn()
atomic.AddInt32(&Count, 1) //然后原子操作自增.
break //一定要跳出循環(huán).
}
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)
}
//當(dāng)原子操作自增count = 10就結(jié)束操作, 也可以睡一會(huì)兒
SpinLock(10, func() {})
}