ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
sync.Pool 临时对象池 === ![](https://box.kancloud.cn/f953c1ee9d17a1c451ac04c96957f662_821x454.png) ### sync.Pool对象的获取 - 尝试从私有对象获取 - 私有对象不存在,尝试从当前Processor的共享池获取 - 如果当前processor共享池也是空的,那末就尝试其他Processir的共享池获取 - 如果所有子池都是空的,最后就用用户指定的New函数产生一个新的对象返回 ### sync.Pool对象的放回 - 如果私有对象不存在则保存为私有对象 - 如果私有对象存在,放入当前Processor子池的共享池当中 ### 小结: 向获取本地私有对象(这个是效率最高的) 如果没有 就像Processor的共享池中获取(这个要锁,效率会降低) 如果还没有 就向其他process的共享池中获取 如果还是没有就new一个 ### 使用 ~~~ pool := &sync.Pool{ New: func() interface{} { return 0 }, } // 获取 i := pool.Get().(int) fmt.Println(i) // 使用完后放回 pool.Put(i) ~~~ ### sync.Pool对象的生命周期 - GC会清除sync.pool缓存的对象 - 对象的缓存有效期为下一个GC之前 GC是随机的,我们没法控制他 `runtime.GC()` 触发以下gc ### 总结 - 适合于通过复用,降低复杂度对象的创建和GC代价 - 协程安全,会有锁的开销 - 生命周期受GC影响,不适合做连接池等,需要自己管理生命周期资源的池化