- 资源竞争
- 使用chan时有几个心得:
- channel
- [golang note] 协程通信">[golang note] 协程通信
- Golang并发模型:并发协程的优雅退出">Golang并发模型:并发协程的优雅退出
- 【Golang】通道channel">【Golang】通道channel
- 关于GOLANG的chan">关于GOLANG的chan
- Golang Channel最佳实践之基本规则">Golang Channel最佳实践之基本规则
- 深入理解 Golang Channel">深入理解 Golang Channel
- Golang通道Channel详解">Golang通道Channel详解
- golang中channel的用法">golang中channel的用法
- Go中的Channel">Go中的Channel
- Go中的Channel——range和select">Go中的Channel——range和select
- golang中channel的用法">golang中channel的用法
- Golang Channel最佳实践之基本规则">Golang Channel最佳实践之基本规则
- golang的channel的几种用法">golang的channel的几种用法
- golang中的空结构体 channel := make(chan struct{})">golang中的空结构体 channel := make(chan struct{})
- golang channel长度相关以及正确判空的方式">golang channel长度相关以及正确判空的方式
- golang channel 使用总结">golang channel 使用总结
- 谈谈golang中的channel">谈谈golang中的channel
- Golang-Channel原理解析">Golang-Channel原理解析
- Golang中的并发控制">Golang中的并发控制
- close
资源竞争
Java的并发:基于线程
Golang的并发:基于协程goroutine
并发会导致资源竞争:加锁
防止资源竞争的三种方式:
- 原子函数:atomic.LoadInt32,atomic.StoreInt32
- 互斥锁:mutex sync.Mutex, mutex.Lock(), mutex.Unlock()
- 通道:channel (基于消息模型)
使用chan时有几个心得:
- 首先,永远是符号
<-
进行读取或者写入,譬如v,ok := <-c
是读取,而c <- v
是写入。 - 其次,读取时,如果没有ok,也是可以读取的。不过如果closed也是能读的,没有赋值而已;如果要知道是否closed得加ok,也就是除非chan永远不关闭,否则读取应该用
v,ok := <-c
而不是用v := <-c
的方式。 - 再次,不能向closed的chan写入,所以一般写入时需要用一个信号的chan(一般buffer为1),来判断是否写入或者放弃,用select判断是写入成功了,还是正在关闭需要放弃写入。
- 最后,如果closed后,chan有数据,ok还是true的,直到chan没有数据了才false。
操作 | nil channel | closed channel | not-closed non-nil channel |
---|---|---|---|
close | panic | panic | 成功 close |
写 ch <- |
一直阻塞 | panic | 阻塞或成功写入数据 |
读 <- ch |
一直阻塞 | 读取对应类型零值 | 阻塞或成功读取数据 |