启动三个协程分别打印1、2、3,要求按照123123123123......的顺序打印出来,可以使用锁或者通道实现
用互斥锁实现
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
var mutex sync.Mutex
count := 1
for num := 1; num < 4; num++ {
wg.Add(1)
go func(n int) {
defer wg.Done()
for {
mutex.Lock()
if count == n {
fmt.Print(count)
count = count%3 + 1
}
mutex.Unlock()
}
}(num)
}
wg.Wait()
}
也可以用通道实现,channel分为有缓冲和无缓冲,内部封装了锁,读写通道是原子性的
无缓冲通道 :发送和接收都会阻塞,直到被接收或者通道有值
有缓冲通道:发送会在缓冲区未满时不阻塞,在缓冲区满时阻塞;接收同上
package main
import (
"fmt"
"sync"
)
func main() {
var wg sync.WaitGroup
ch := make(chan int)
defer close(ch)
for num := 1; num < 4; num++ {
wg.Add(1)
go func(n int) {
defer wg.Done()
for {
count := <-ch
if count == n {
fmt.Print(count)
ch <- count%3 + 1
continue
}
ch <- count
}
}(num)
}
ch <- 1
wg.Wait()
}