Go语言学习之并发(理论篇)

概念

并发是指一个 Go 程序运行在多个 goroutine 中,每个 goroutine 中的事件执行先后顺序无法确定。

并发安全

  • 并发安全是指一个可以在串行程序中正确执行的函数,它在并发调用时仍然可以正确执行,那么这个函数是并发安全的
  • 并发访问一个变量,保证变量并发安全的方法是限制变量只存于一个goroutine中,或维护一个更高层的互斥不变量。
  • 函数并发调用时,不能正常执行的原因主要有死锁、活锁和资源耗尽。

竞态

  • 竞态是指一个Go程序在多个goroutine中按照某些交错顺序执行时,这个Go程序无法给出正确的执行结果
  • 其中数据竞态是竞态的一种,它发生于两个 goroutine 并发读写同一个变量并且至少其中一个 goroutine 是写入时。

避免数据竞态的方法:

  • 不修改变量。
  • 避免从多个goroutine访问同一个变量
  • 允许多个goroutine访问同一个变量。但在同一时间只有一个goroutine可以访问变量

互斥锁

  • 在 Go 语言中,sync 包有一个单独的 Mutex 类型,它支持互斥锁模式。Mutex 类型的 Lock 方法用于获取 tokenUnlock 方法用于释放 token
  • 定义的 Mutex 类型的变量称为互斥量,用来保护共享变量。被互斥量保护的变量声明应该紧接在互斥量的声明之后。
  • 为了防止未执行 Unlock 方法,通常在 Lock 方法后,使用 defer 语句调用 Unlock 方法。

读写互斥锁

互斥锁严格锁定读和写,在一些场景中,允许只读操作可以并发执行,但写操作需要获得完全独享的访问权限,sync 包中的 RWMutex 类型包含 RLockRUnlock 方法,可以提供这种功能。RLockRUnlock 方法分别获取和释放一个读锁(共享锁)。

延迟初始化

sync 包中有一个 Once 类型,Once 类型只有一个 Do 方法,Once 类型包含一个 bool 变量和一个互斥量,bool 变量记录初始化是否已完成,互斥量负责保护这个 bool 变量和客户端的数据结构。

goroutine 与线程

goroutine 与线程的区别:

栈内存:线程的栈内存固定大小 2mb,goroutine 栈内存默认 2KB,但可按需增大和缩小,最大限制是 1GB。

调度:线程由系统内核调度,成本高,速度慢。goroutineGo 调度器调度,Go 调度器只需要关心单个 Go 程序的 goroutine 调度问题,成本低。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值