资源竞争

Java的并发:基于线程
Golang的并发:基于协程goroutine
并发会导致资源竞争:加锁
防止资源竞争的三种方式:

  1. 原子函数:atomic.LoadInt32,atomic.StoreInt32
  2. 互斥锁:mutex sync.Mutex, mutex.Lock(), mutex.Unlock()
  3. 通道:channel (基于消息模型)

使用chan时有几个心得:

  1. 首先,永远是符号<-进行读取或者写入,譬如v,ok := <-c是读取,而c <- v是写入。
  2. 其次,读取时,如果没有ok,也是可以读取的。不过如果closed也是能读的,没有赋值而已;如果要知道是否closed得加ok,也就是除非chan永远不关闭,否则读取应该用v,ok := <-c而不是用v := <-c的方式。
  3. 再次,不能向closed的chan写入,所以一般写入时需要用一个信号的chan(一般buffer为1),来判断是否写入或者放弃,用select判断是写入成功了,还是正在关闭需要放弃写入。
  4. 最后,如果closed后,chan有数据,ok还是true的,直到chan没有数据了才false。
操作 nil channel closed channel not-closed non-nil channel
close panic panic 成功 close
ch <- 一直阻塞 panic 阻塞或成功写入数据
<- ch 一直阻塞 读取对应类型零值 阻塞或成功读取数据

channel

[golang note] 协程通信

Golang并发模型:并发协程的优雅退出

【Golang】通道channel

关于GOLANG的chan

Golang Channel最佳实践之基本规则

深入理解 Golang Channel

Golang通道Channel详解

golang中channel的用法

Go中的Channel

Go中的Channel——range和select

golang中channel的用法

Golang Channel最佳实践之基本规则

golang的channel的几种用法

golang中的空结构体 channel := make(chan struct{})

golang channel长度相关以及正确判空的方式

golang channel 使用总结

谈谈golang中的channel

Golang-Channel原理解析

Golang中的并发控制

close

How to Gracefully Close Channels

如何优雅的关闭Golang Channel?

golang中几种channel的关闭方式的学习与总结

golang chan 关闭时的原则

Go学习笔记- 如何优雅的关闭Go Channel【译】