什么是sync.Pool?
sync.Pool是用来保存可以被重复使用的临时对象,以便在以后的同类操作中可以重复使用,从而避免了反复创建和销毁临时对象带来的消耗以及对GC造成的压力。常用池化技术来提高程序的性能,例如连接池、线程池等。sync.Pool是并发安全的,可以在多个goroutine中并发调用sync.Pool存取对象。
在Golang的很多标准库和很多知名的开源库中,都可以看到大量使用sync.Pool的场景。例如encoding/json包中的Valid方法使用sync.Pool创建scanner对象,Gin框架使用sync.Pool来复用每个请求都会创建的gin.Context对象。
但需要注意的是,sync.Pool保存的对象随时可能在不发出通知的情况下被清除,因此不能使用sync.Pool存储需要持久化的对象。
sync.Pool使用方法
首先看一段示例代码:
package main
import "sync"
type scanner struct {
Name string
}
func main() {
pool := sync.Pool{
New: func() interface{} {
return &scanner{
Name: "json",
}
},
}
scan := pool.Get().(*scanner)
println(scan.Name)
pool.Put(scan)
}
初始化sync.Pool的时候,需要提供一个对象的构造函数New。使用Get从对象池中获取对象,使用Put将对象放回到对象池。
可以看出sync.Pool的使用方法非常简单,对外只提供三个方法:New、Get和Put
- New方法,使用Get方法从对象池中获取对象的时候,对象池中如果没有,会调用New方法创建一个新的对象。
- Get方法,从对象池中获取一个对象。
- Put方法,将对象放回到对象池,下次Get的时候可以复用。
小结
本文介绍了sync.Pool的作用和使用方法,下篇文章深入源码解析sync.Pool。