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)
wg.Done()
wg.Wait()
GC垃圾回收
- 引用计数
- 对每个对象维护一个引用计数,当引用该对象的对象被销毁或更新时被引用对象的引用计数自动减一,当被引用对象被创建或被赋值给其他对象时引用计数自动加一。当引用计数为0时则立即回收对象
- 标记-清除
- 标记从根变量开始迭代得遍历所有被引用的对象,对能够通过应用遍历访问到的对象都进行标记为“被引用”;标记完成后进行清除操作,对没有标记过的内存进行回收
- 分代回收
Go中的锁
var mutex sync.Mutex
mutex.Lock()
defer mutex.Unlock()
var rwm sync.RWMutex
rwm.RLock()
rwm.RUnlock()
var sm sync.Map
sm.Store(1,"a")
v, ok := sm.Load(1)