当 chanel 的容量为 1 的时候能够作为锁来实现一些原子操作
比方 咱们想实现一个 + 1 的协程 还要保障原子性 就能够这样:
package main
import (
"fmt"
"time"
)
func main() {test_chan := make(chan bool, 1) // 这里容量设为 1
var x int
for i := 0; i < 1000; i++ {go rise(test_chan, &x)
}
time.Sleep(time.Second) // 用 mutex 更佳
fmt.Println("the value of x is :", x)
}
// 因为要扭转原来 x 的值 所以这里要应用指针
// 因为信道的容量为 1 所以写数据后 进行原子操作 而后立马数据推出去
func rise(ch chan bool, x *int) {
ch <- true
*x = *x + 1
<-ch
}
运行后果:
the value of x is : 1000