[Golang]同步工具-sync包的Pool(上)-心智图总结

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 mainimport ("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。

http://img2.58codes.com/2024/20131728QY6X4P2iLd.png

参考来源:
郝林-Go语言核心36讲
https://github.com/hyper0x/Golang_Puzzlers
https://golang.org/pkg/cmd/go/internal/test/


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章