golang快速入门--原理入门

GO基础知识

如何实现安全读写共享变量

  • 使用channel进行安全读写共享变量
  • chanel可以理解为python、redis中的队列
  • 可以在进程之间传递

channel有同步与异步之分

  • 在初始化一个chan时,可以指定其没有缓冲,则其要求发送要求需要同步
  • 如果指定需要缓冲,则发送消息进chan与消费chan可以不需要同步

go中的并发机制怎么实现的

  • 由Goroutine实际执行
  • 底层使用协程coroutine实现
  • 可以理解为早期python的greenlet
  • 工作原理:正常情况下一个cpu对象启一个工作线程对象,线程去检查并执行goroutine对象。碰到goroutine对象阻塞的时候,会启动一个新的工作线程,以充分利用cpu资源。 所有有时候线程对象会比处理器对象多很多

go中常见的并发控制

  • 通过channel通知实现并发控制(生产者与消费者模型)
  • 通过sync包中的WaitGroup实现并发控制,阻塞异步执行
var wg sync.WaitGroup
wg.Add(1) // 可以添加或减少 goroutine的数量
wg.Done() // 相当于Add(-1)
wg.Wait() // 执行后会堵塞主线程,直到WaitGroup 里的值减至0

GC垃圾回收

  • 引用计数
    • 对每个对象维护一个引用计数,当引用该对象的对象被销毁或更新时被引用对象的引用计数自动减一,当被引用对象被创建或被赋值给其他对象时引用计数自动加一。当引用计数为0时则立即回收对象
  • 标记-清除
    • 标记从根变量开始迭代得遍历所有被引用的对象,对能够通过应用遍历访问到的对象都进行标记为“被引用”;标记完成后进行清除操作,对没有标记过的内存进行回收
  • 分代回收

Go中的锁

  • 互斥锁
var mutex sync.Mutex // 声明锁
mutex.Lock() // 获得锁
defer mutex.Unlock() // 释放锁
  • 读写锁
// 写线程必须等待所有读线程都释放锁以后,才能取得锁;同样的,读线程必须等待写线程释放锁后,才能取得锁
var rwm sync.RWMutex // 声明读写锁
rwm.RLock() 
rwm.RUnlock()

  • map安全锁【类似于redis的分布式锁】
var sm sync.Map
sm.Store(1,"a")
v, ok := sm.Load(1)
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值