阻塞信道
package main
import (
"fmt"
"time"
)
func main() {
count := 1000
incs := make(chan int, 1)
go func() {
for i := count; i > 0; i-- {
incs <- i
}
}()
go func(chan int) {
for {
i := <-incs
fmt.Println("A get ticket", i)
time.Sleep(100)
}
}(incs)
go func(chan int) {
for {
i := <-incs
fmt.Println("B get ticket", i)
time.Sleep(100)
}
}(incs)
time.Sleep(2 * time.Second)
}
设置信道的容量为1,使其成为阻塞信道,起到阻塞协程的作用。
信道已满时,阻塞流入协程;信道为空时,阻塞流出协程。
time.Sleep(100)的作用是防止CPU被某一流出协程一直抢占。
time.Sleep(2 * time.Second)的作用是保证非主协程执行完毕。
互斥锁
package main
import (
"fmt"
"time"
"sync"
)
func main() {
count := 1000
var l sync.Mutex
go func(*int) {
for count > 0 {
l.Lock()
fmt.Println("A get ticket", count)
count--
l.Unlock()
time.Sleep(100)
}
}(&count)
go func(*int) {
for count > 0 {
l.Lock()
fmt.Println("B get ticket", count)
count--
l.Unlock()
time.Sleep(100)
}
}(&count)
time.Sleep(2 * time.Second)
}
备注:一定要在linux环境下运行
go run main.go