Go语言的并发

本文探讨Go语言的并发特性,重点在于原子操作和基于信道的通信。强调通过通信共享内存而非共享内存通信,并详细介绍了信道的使用,包括可能的错误操作、无缓存和带缓存的信道、使用select监听多个channel以及goroutine的退出机制。
摘要由CSDN通过智能技术生成

Go语言的并发

原子操作

可以利用sync包中的Mutex对于资源进行加锁,从而保证资源的原子性。但其实Go官方并不推荐这种方法,更提倡用通信的方法来进行内存的共享。

不要以共享内存的方式来通信,作为替代,我们应该以通信的手段来共享内存

基于信道的通信

​ channel是在Goroutine之间进行同步的主要方法,读写通过“->”完成

​ 通过make函数进行声明

可能出现错误的操作

  • 关闭一个未初始化(nil) 的 channel 会产生 panic

  • 重复关闭同一个 channel 会产生 panic

  • 向一个已关闭的 channel 中发送消息会产生 panic

  • 从已关闭的 channel 读取消息不会产生 panic,且能读出 channel 中还未被读取的消息,若消息均已读出,则会读到类型的零值。从一个已关闭的 channel 中读取消息永远不会阻塞,并且会返回一个为 false 的 ok-idiom,可以用它来判断 channel 是否关闭

  • 关闭 channel 会产生一个广播机制,所有向 channel 读取消息的 goroutine 都会收到消息

无缓存

无论是写入还是读取channel都会阻塞,直到另外一个goroutine读取或写入这个channel

带缓存

当缓存满时,写入channel会阻塞,直到另外一个goroutine取走一个数据。

当缓存为空时,读取channel会阻塞,直到另外一个goroutine写入一个数据。

使用select同时监听多个channel

select {
   
    case <- ch1:
    ...
    case <- ch2:
    ...
    case ch3 <- 10;
    ...
    default:
    ...
}

如果没有定义default操作,那么当所有的channel都阻塞的时候,select也会阻塞。

这个只能监听一次消息,如果想要一直监听的话。

msgCh := make(chan
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值