单向通道
- 通常用在函数的参数,防止乱用通道
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 main
import (
"fmt"
"sync"
)
var x = 0
func add() {
for i := 0; i<5000; i++ {
x = x +1
}
wg.Done()
}
var wg sync.WaitGroup
func 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去取值