前言
在 golang 中有一个池,它特别神奇,你只要和它有个约定,你要什么它就给什么,你用完了还可以还回去,但是下次拿的时候呢,确不一定是你上次存的那个,这个池就是 sync.Pool
package main
import (
"fmt"
"sync"
)
var strPool = sync.Pool{
New: func() interface{} {
return "test str"
},
}
func main() {
str := strPool.Get()
fmt.Println(str)
strPool.Put(str)
}
- 通过New去定义你这个池子里面放的究竟是什么东西,在这个池子里面你只能放一种类型的东西。比如在上面的例子中我就在池子里面放了字符串。
- 我们随时可以通过Get方法从池子里面获取我们之前在New里面定义类型的数据。
- 当我们用完了之后可以通过Put方法放回去,或者放别的同类型的数据进去。
目的
那么这个池子的目的是什么呢?其实一句话就可以说明白,就是为了复用已经使用过的对象,来达到优化内存使用和回收的目的。说白了,一开始这个池子会初始化一些对象供你使用,如果不够了呢,自己会通过new产生一些,当你放回去了之后这些对象会被别人进行复用,当对象特别大并且使用非常频繁的时候可以大大的减少对象的创建和回收的时间。
- 临时对象
- 自动移除
- 当这个对象的引用只有sync.Pool持有时,这个对象内存会被释放
- 多线程安全
- 目的就是缓存并重用对象,减少GC的压力
- 自动扩容、缩容
- 不要去拷贝pool,也就是说最好单例
网友评论