go并发需要满足go memory modelhappens before原则

Channel

具有队列特性

1
2
3
4
5
6
7
8
9
ch:=make(chan T) // 双向通道
ch:=make(chan T, N) // 有缓存区
ch:=make(chan <- T) // 只能发送
ch:=make(<- chan T) // 只能接收
ch <- v // 发送
v = <- ch // 接收
cap(ch) // 容量
len(ch) // 长度
close(ch)

sync.Mutex

保护数据不被多个使用者并发读取或修改
sync.RWMutex: 读写锁,含写锁和读锁

1
2
3
4
5
6
7
8
9
10
type Value struct{
m sync.Mutex
v int
}
func (val *Value) modify(newVal int) int {
val.m.Lock() // 上锁状态下若加上新锁,会导致当前协程阻塞,直至当前mutex被unlock
defer val.m.Unlock()
val.v=newVal
return val.v
}

sync.WaitGroup

让主协程等待其他子协程先完成任务

1
2
3
4
5
6
7
8
9
var wg sync.WaitGroup
wg.Add(N) // 添加子协程数量
for i:=0;i<N;i++{
go func(){
fmt.Println("Done:",i)
wg.Done()
}()
}
wg.Wait() // 阻塞主协程,直至所有子协程done

sync.Once

确保代码在并发中仅被执行一次

sync.Cond

实现多个协程之间的通信


cover
id:122225604
画师: ノーコピーライトガール