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 := p.pin()
//如果private对象不为空则直接返回,并将其置为nil
x := l.private
l.private = nil
runtime_procUnpin()
if x

最低0.47元/天 解锁文章
912

被折叠的 条评论
为什么被折叠?



