Golang中sync.Pool用来提高对象复用几率,减少gc的压力,减少内存分配,它是线程安全的,常用来存储并复用临时对象。
原理
为了减小并发中锁的竞争,sync.pool为每个P(对象cpu线程)分配一个子池子poolLocal,每个poolLocal有private对象和shared共享列表对象,private对象只有对应的P可访问,无需加锁, shared共享列表对象可被其它P共享,需要加锁。
Pool结构体
type Pool struct {
noCopy noCopy //该对象不能被copy使用
local unsafe.Pointer // [p]poolLocal,固定长度
localSize uintptr //本地缓冲池poolLocal的数量
New func() interface{} //用户自定义的用于生成对象的方法
}
Get函数
作用:从Pool中获取一个对象,如果获取不到并且New函数不为空,则通过New创建一个对象并返回。否则返回nil
func (p *Pool) Get() interface{} {
if race.Enabled {
race.Disable()
}
//获取当前线程的poolLocal
l :=