- sync.Pool 對象緩存
- 對象獲取
- 嘗試從私有對象獲取(私有對象是協(xié)程安全的)
- 私有對象不存在 嘗試從當(dāng)前Processor的共享池獲取(共享池是協(xié)程不安全 需要鎖)
- 如果當(dāng)前Processor共享池是空的 那么嘗試去其他Processor的共享池獲取
- 如果所有子池都是空的 最后使用用戶指定的New()函數(shù)產(chǎn)生一個(gè)新的對象返回
- 對象放回
- 如果私有對象不存在則保存為私有對象
- 如果私有對象存在 放入當(dāng)前Processor子池的共享池中
- 對象的聲明周期
- GC會(huì)清除sync.Pool緩存的對象
- 對象的緩存有效期為下一次GC之前
func main() {
var wg sync.WaitGroup
pool := &sync.Pool{
New: func() interface{} {
fmt.Println("create a new obj.")
return 100
},
}
pool.Put(10)
pool.Put(10)
pool.Put(10)
for i := 0; i < 10; i++ {
wg.Add(1)
go func(id int) {
defer func() {
wg.Done()
}()
fmt.Println(pool.Get())
}(i)
}
wg.Wait()
}