更应该叫sync.Cache, 是某一个对象的缓存, 不是对象池
- GC会清除sync.pool缓存的对象
- 对象的缓存有效期为下一次GC之前
1 创建一个Pool
pool := &sync.Pool{
New: func() interface{} {
return 0
},
}
2 对象取出
- 尝试从私有对象获取
- 私有对象不存在, 尝试从当前Processor的共享池获取
- 如果当前Processor共享池也是空的, 就尝试去其它Processor的共享池获取
如果所有子池都是空的, 就用用户指定的New函数产生一个新的对象返回
v := pool.Get()
fmt.Println(v)
3 对象放入
如果私有对象不存在则保存为私有对象
- 如果私有对象存在, 放入当前Processor子池的共享池中
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
pool.Put(99) // 放入到私有对象
pool.Put(88) // 私有对象存在, 放入当前Processor子池的共享池中
pool.Put(77) // 私有对象存在, 放入当前Processor子池的共享池中
for i := 0; i < 4; i++ {
fmt.Println(pool.Get()) // 99 77 88 0
}
runtime.GC()
v = pool.Get()
fmt.Println(v) // 0
}
```