var mu sync.Mutex
func Println(v ...interface{}){
mu.Lock()
fmt.Println(v...)
mu.Unlock()
}
func main(){
ch := make(chan int)
go func(){
for{
c :=<-ch
Println("one:",c,"len:",len(ch))
}
}()
go func(){
for{
c :=<-ch
Println("two:",c,"len:",len(ch))
}
}()
for i:=1;i<=100;i++{
ch<-i
}
time.Sleep(time.Second * time.Duration(2))
}
/*
输出
two: 1 len: 0
two: 3 len: 0
two: 4 len: 0
two: 5 len: 0
two: 6 len: 0
two: 7 len: 0
one: 2 len: 0
two: 8 len: 0
two: 10 len: 0
two: 11 len: 0
two: 12 len: 0
one: 9 len: 0
two: 13 len: 0
two: 15 len: 0
two: 16 len: 0
one: 14 len: 0
one: 18 len: 0
...
结论:channel的接收和 之后的代码不是一起同时执行,不具有原子性,当channel被接收的时候,协程切换了
*/