sync.Pool 臨時對象池
===

### 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開發風格規范