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影响,不适合做连接池等,需要自己管理生命周期资源的池化
- Hello World
- UDP
- UDP服务端
- UDP客户端
- UDP广播
- 错误处理
- 编写好的异常处理
- panic和recover
- 并发编程
- Hello Goruntine
- 共享内存并发机制
- RWMutex
- CSP并发机制
- 多路复用和超时控制
- 通道关闭与广播
- Context与任务的取消
- 只运行一次
- 按需任意任务完成
- 所有任务完成
- 补充:range channel注意实现
- 对象池
- sync.Pool临时对象池
- 单元测试
- 表格测试法
- Banchmark
- BDD
- 反射
- 利用反射编写灵活的代码
- Struct Tag
- 万能程序
- 常用架构模式
- Pipe-filter pattern
- Micro Kernel
- 性能分析
- 高性能代码
- sync.MAP分析
- Concurrent Map
- GC友好的代码
- Uber开发风格规范