1. sync.Pool 的功用
sync.Pool通常被称为,临时对象池。
在频繁地分配和回收内存,会给GC带来一定的负担。
sync.Pool可以将暂时不用的对象缓存起来,下次要需要使用的时候,可以直接使用。
Pool这名字可能会产生误导,Pool里装的对象,会在没有通知的情况下,被回收。用Cache来思考这个功能,会比较直观。
2. sync.Pool类型,有两个方法,Put和Get
A. Get方法,会从当前的池中删除掉任何一个值,然後把这个值做为结果返回。
如果此时当前的池中没有任何值,那麽这个方法就会使用当前池的New字段创建一个新值,并将值返回。
B. Put方法,会将临时对象,储存到池中。
3. 初始化临时对象池
sync.Pool类型的New字段代表着创建临时对象的函数。这个函数的类型是没有参数但有唯一结果的函数类型。
func() interface{}
而这个New字段的函数,需要我们在初始化临时对象池的时候就给定。
4. 程序码范例
package main
import (
"fmt"
"sync"
)
func main() {
pool := &sync.Pool{
New: func() interface{} {
fmt.Println("Create a new object.")
return 10
},
}
pool.Put(100)
pool.Put(100)
pool.Put(100)
var wg sync.WaitGroup
for i := 0; i < 10; i++ {
wg.Add(1)
go func(id int) {
fmt.Println(pool.Get())
wg.Done()
}(i)
}
wg.Wait()
}
https://play.golang.org/p/zHZObADzCg9
说明:
将临时对象100,存放三次,到临时对象池中。
前三个goroutine,会从临时对象池取得100。
之後的goroutine取不到值,就会呼叫New字段的函数。而New函数会回传10。
参考来源:
郝林-Go语言核心36讲
https://github.com/hyper0x/Golang_Puzzlers
https://golang.org/pkg/cmd/go/internal/test/
>>: [Golang]同步工具-sync包的Pool(下)-心智图总结
第 24 天 ! 倒数一个礼拜!! 今天来介绍 Redux !! 什麽是 Redux 在官方开头就有...
「快点签名啦。」 今天要来介绍数位签章。 首先澄清一点,数位签章是以数学运算的方式进行的签章,「签章...
上面这个是今天会提到的内容,如果你已经可以轻松看懂,欢迎直接左转去看我队友们的精彩文章! 昨天我们...
第3个决定 决定ERP後台资料库 在所有资料库里笔者用过Oracle 和MS SQL,这2者使用时间...
Azure cognitive service: image description- 看图说故事 ...