两个协程交替打印1到20

参考解析

题目来源:字节跳动

答案:

  1. 使用channel
  1. package main
  2. import (
  3. "fmt"
  4. "sync"
  5. "time"
  6. )
  7. func main() {
  8. wg := &sync.WaitGroup{}
  9. ch1 := make(chan int)
  10. ch2 := make(chan int)
  11. wg.Add(2)
  12. go say(wg, ch2, ch1)
  13. go say1(wg, ch1, ch2)
  14. wg.Wait()
  15. time.Sleep(1 * time.Second)
  16. }
  17. func say(wg *sync.WaitGroup, ch2 chan int, ch1 chan int) {
  18. defer wg.Done()
  19. for i := 1; i <= 10; i++ {
  20. ch2 <- 2*i - 1
  21. fmt.Println(<-ch1)
  22. }
  23. }
  24. func say1(wg *sync.WaitGroup, ch1 chan int, ch2 chan int) {
  25. defer wg.Done()
  26. for i := 1; i <= 10; i++ {
  27. fmt.Println(<-ch2)
  28. ch1 <- 2 * i
  29. }
  30. }

2.使用锁

  1. //使用锁
  2. // 一个协程对该变量进行操作时进行加锁,另一个协程等待。
  3. // 释放锁后再进行操作,每次操作进行加1即可
  4. package main
  5. import (
  6. "fmt"
  7. "sync"
  8. "time"
  9. )
  10. type Alternate struct {
  11. count int
  12. mu sync.Mutex
  13. }
  14. func main(){
  15. tong:=Alternate{count: 0}
  16. go tong.printOld()
  17. time.Sleep(time.Millisecond*20)
  18. go tong.printEvent()
  19. time.Sleep(time.Second*3)
  20. }
  21. // 两个协程,一个获取锁一个等待不断交换
  22. // 打印第一个数
  23. func (tong *Alternate)printOld(){
  24. for tong.count<20{
  25. tong.mu.Lock()
  26. tong.count += 1
  27. fmt.Println(tong.count)
  28. tong.mu.Unlock()
  29. }
  30. return
  31. }
  32. // 第二个数 = 第一个数 + 1
  33. func (tong *Alternate)printEvent(){
  34. for tong.count<20{
  35. tong.mu.Lock()
  36. tong.count += 1
  37. fmt.Println(tong.count)
  38. tong.mu.Unlock()
  39. }
  40. return
  41. }