单向通道
- 通常用在函数的参数,防止乱用通道
select
同一时刻有多个通道要操作的场景,使用select
- 可处理一个或者多个channel的发送/接收操作
- 如果没有不符合就会选择另外的case判断
func main() {ch := make(chan int, 1)for i := 0; i<10; i++ {select {case x := <- ch:fmt.PrintIn(x)case ch <- i:}}}
sync
package mainimport ("fmt""sync")var x = 0func add() {for i := 0; i<5000; i++ {x = x +1}wg.Done()}var wg sync.WaitGroupfunc main() {wg.Add(2)go add()go add()wg.Wait()fmt.Println(x)}
- 使用公共的空间,公共的数据就有问题;
互斥锁
互斥锁是一种常用的控制共享资源访问的方法,它能够保证同时只有一个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去取值
已经关闭的通道,再次关闭也会引导panic
