image.png已经关闭的通道,再次关闭也会引导panic

单向通道

  • 通常用在函数的参数,防止乱用通道

只读通道: <- chan
只写通道:chan <-

select

同一时刻有多个通道要操作的场景,使用select

  • 可处理一个或者多个channel的发送/接收操作
  • 如果没有不符合就会选择另外的case判断
    1. func main() {
    2. ch := make(chan int, 1)
    3. for i := 0; i<10; i++ {
    4. select {
    5. case x := <- ch:
    6. fmt.PrintIn(x)
    7. case ch <- i:
    8. }
    9. }
    10. }

sync

  1. package main
  2. import (
  3. "fmt"
  4. "sync"
  5. )
  6. var x = 0
  7. func add() {
  8. for i := 0; i<5000; i++ {
  9. x = x +1
  10. }
  11. wg.Done()
  12. }
  13. var wg sync.WaitGroup
  14. func main() {
  15. wg.Add(2)
  16. go add()
  17. go add()
  18. wg.Wait()
  19. fmt.Println(x)
  20. }
  • 使用公共的空间,公共的数据就有问题;

    互斥锁

    互斥锁是一种常用的控制共享资源访问的方法,它能够保证同时只有一个goroutine可以访问共享资源。GO语言中使用sync包的mutex类型来实现互斥锁。使用互斥锁来修复上面代码的问题:

var lock sync.Mutex 互斥锁,同一时间只能一个线程进行数据操作

  • rwlock 读写锁

  • sync.Once do 加载一次

  • sync.Map Go语言中内置的map不是并发安全的 make(map[string][int])

var m = sync.Map{} m.store(key, map) value, _ := m.Load(key) //必须使用load方法根据key去取值