这篇文章讲述了 Go 的内存模型。虽然名称叫Memory Model,但是我感觉讲的内容并不多。主要讲得就是 Go 中的可见性原则,即一个读操作如果查看变量的值。
这个感觉理解起来比较简单,需要记住的就是如果一个读操作和一个写操作可能同时发生的话,那么读操作可能读取的是旧的值。此时就需要使用同步原语执行同步操作。
Go 语言中自身并不提供可重入锁,而且 Go 官方也不愿意添加可重入锁的支持。
上述文章中使用 sync.mutex 和 sync.cond 实现了简单的可重入锁。主要实现思路就是锁中加一个 Goroutine 的 ID 和 sync/cond 同步条件。对于一个已经加锁的锁来说,如果是拥有者 Goroutine 上锁能够正常上锁。如果是其他 Goroutine 上锁的时候,则会利用cond.wait执行阻塞操作,直到其他 Goroutine 解锁后唤醒当前 Goroutine。