• 【2019年第13周】【2019/03/25 - 2019/03/31 】
  • A. LeetCode 8
  • R: The Go Memory Model
  • T: 一条面试题引发的关于 Go 语言中锁的思考
  • S: go reentrant lock(可重入锁) 简单实现

Algorithm

Review

这篇文章讲述了 Go 的内存模型。虽然名称叫Memory Model,但是我感觉讲的内容并不多。主要讲得就是 Go 中的可见性原则,即一个读操作如果查看变量的值。

这个感觉理解起来比较简单,需要记住的就是如果一个读操作和一个写操作可能同时发生的话,那么读操作可能读取的是旧的值。此时就需要使用同步原语执行同步操作。

可用的同步原语有: Channel, LockOnce

Tips

Share

Go 语言中自身并不提供可重入锁,而且 Go 官方也不愿意添加可重入锁的支持

上述文章中使用 sync.mutexsync.cond 实现了简单的可重入锁。主要实现思路就是锁中加一个 Goroutine 的 ID 和 sync/cond 同步条件。对于一个已经加锁的锁来说,如果是拥有者 Goroutine 上锁能够正常上锁。如果是其他 Goroutine 上锁的时候,则会利用cond.wait执行阻塞操作,直到其他 Goroutine 解锁后唤醒当前 Goroutine。