github.com/code-reading/golang@v0.0.0-20220303082512-ba5bc0e589a3/docs/002-sync.Pool源码分析.md (about) 1 ## sync.Pool 源码分析 2 3 [分析示例:coding/sync](../coding/sync) 4 5 [源码位置:/src/sync/pool](../go/src/sync.pool.go) 6 7 8 sync.Pool 是 Golang 内置的对象池技术,可用于缓存临时对象,避免因频繁建立临时对象所带来的消耗以及对 GC 造成的压力。 9 10 需要注意的是,sync.Pool 缓存的对象随时可能被无通知的清除,因此不能将 sync.Pool 用于存储持久对象的场景。 11 12 sync.Pool 作为 goroutine 内置的官方库,其设计非常精妙。sync.Pool 不仅是并发安全的,而且实现了 lock free,里面有许多值得学习的知识点。 13 14 ## sync.Pool 主要特点 15 - 利用 GMP 的特性,为每个 P 创建了一个本地对象池 poolLocal,尽量减少并发冲突。 16 17 - 每个 poolLocal 都有一个 private 对象,优先存取 private 对象,可以避免进入复杂逻辑。 18 19 - 在 Get 和 Put 期间,利用 pin 锁定当前 P,防止 goroutine 被抢占,造成程序混乱。 20 21 - 在获取对象期间,利用对象窃取的机制,从其他 P 的本地对象池以及 victim 中获取对象。 22 23 - 充分利用 CPU Cache 特性,提升程序性能。