golang的sync包系列讲解(2):sync.Pool

sync.Pool 是一个用来缓存大量重复对象,减少大量对象创建给GC压力,是sync异步包中很重要的一种数据结构,看其基本数据结构:

type Pool struct {
// noCopy 表示不支持值拷贝,如果出现值拷贝用 go vet 编译检查的时候会报错
noCopy noCopy

// [P]poolLocal,表示每个local的P池
local unsafe.Pointer
// local的长度
localSize uintptr

// 也是[P]poolLocal,表示上一个生命周期的local
victim unsafe.Pointer
// victim的长度
victimSize uintptr

// 用于创建新对象方法,get获取不到就会调用创建一个新对象,一般由用户传入
New func() interface{}
}


图引至码农桃花源公众号

sync.Pool 的用法

sync.Pool的用法很简单,就三个方法:

//初始化pool对象
var pool sync.Pool

type shikanon struct {
num int
}

// 创建新对象创建方法
func initPool() {
pool = sync.Pool{
New: func() interface{} {
return &shikanon{num: rand.Int()}
},
}
}

func main() {
initPool()
// 从pool对象池中取对象
p1 := pool.Get().(*shikanon)
fmt.Println("p1", p1.num)

// 将对象放入pool对象池
pool.Put(p1)

p2 := pool.Get().(*shikanon)
fmt.Println("p2", p2.num)
}

官方的单元测试用例

原理结构

sysnc.Poollocal采用的是双向无锁队列

shikanon wechat
欢迎您扫一扫,订阅我滴↑↑↑的微信公众号!