Java的并发:基于线程
Golang的并发:基于协程goroutine
并发会导致资源竞争:加锁
防止资源竞争的三种方式:
- 原子函数:atomic.LoadInt32,atomic.StoreInt32
- 互斥锁:mutex sync.Mutex, mutex.Lock(), mutex.Unlock()
- 通道:channel
通道Channel
声明
使用chan声明通道,并指明需要发送和接收的数据类型。例如:
ch := make(chan int)
声明通道可以有第二个参数,用来指定通道大小。
ch := make(chan int)
ch := make(chan int, 0)
ch := make(chan int, 2)
第一种和第二种等价,都为无缓冲通道。第三种为有缓冲通道,容量为2。
发送和接收
使用操作符 -> 进行发送和接收
ch <- 2 //发送数值2给这个通道
x: = <-ch //从通道里读取值,并把读取的值赋值给x变量
<- ch //从通道里读取值,然后忽略
关闭
当通道关闭时,就不能再往通道发送数据了,但是可以从通道接收数据。
close(ch)
通道缓冲
- 无缓冲通道
无缓冲通道,如果发送和接收有一方还没有准备好的话,先执行的一方会阻塞直到另一方操作结束。无缓冲通道也称为同步通道。 - 有缓冲通道
有缓冲通道类似于队列。发送操作即向队列的尾部插入一条数据。接收操作类似删除队列头部数据,并返回删除的这条数据。
单向通道
var send chan<- int //只能发送
var receive <-chan int //只能接收
网友评论