更应该叫sync.Cache, 是某一个对象的缓存, 不是对象池

  • GC会清除sync.pool缓存的对象
  • 对象的缓存有效期为下一次GC之前

image.png

1 创建一个Pool

  1. pool := &sync.Pool{
  2. New: func() interface{} {
  3. return 0
  4. },
  5. }

2 对象取出

  • 尝试从私有对象获取
  • 私有对象不存在, 尝试从当前Processor的共享池获取
  • 如果当前Processor共享池也是空的, 就尝试去其它Processor的共享池获取
  • 如果所有子池都是空的, 就用用户指定的New函数产生一个新的对象返回

    1. v := pool.Get()
    2. fmt.Println(v)

    3 对象放入

  • 如果私有对象不存在则保存为私有对象

  • 如果私有对象存在, 放入当前Processor子池的共享池中
    1. pool.Put(10)

    4 代码示例

    ```go package main

import ( “fmt” “runtime” “sync” )

func main() { pool := &sync.Pool{ New: func() interface{} { return 0 }, } v := pool.Get() fmt.Println(v) // 0

  1. pool.Put(99) // 放入到私有对象
  2. pool.Put(88) // 私有对象存在, 放入当前Processor子池的共享池中
  3. pool.Put(77) // 私有对象存在, 放入当前Processor子池的共享池中
  4. for i := 0; i < 4; i++ {
  5. fmt.Println(pool.Get()) // 99 77 88 0
  6. }
  7. runtime.GC()
  8. v = pool.Get()
  9. fmt.Println(v) // 0

}

```