[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 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。

https://ithelp.ithome.com.tw/upload/images/20201208/20131728QY6X4P2iLd.png

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


<<:  Gulp bower(1) DAY85

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

Day 24 Redux 简介

第 24 天 ! 倒数一个礼拜!! 今天来介绍 Redux !! 什麽是 Redux 在官方开头就有...

DAY 19-数位签章- DSA

「快点签名啦。」 今天要来介绍数位签章。 首先澄清一点,数位签章是以数学运算的方式进行的签章,「签章...

[Day08] TS:什麽!型别也能做条件判断?认识 Conditional Types

上面这个是今天会提到的内容,如果你已经可以轻松看懂,欢迎直接左转去看我队友们的精彩文章! 昨天我们...

如何自己设计一套ERP程序 前传-写ERP之前要决定的20件事 决定ERP後台资料库

第3个决定 决定ERP後台资料库 在所有资料库里笔者用过Oracle 和MS SQL,这2者使用时间...

Day 10 Azure cognitive service: image description- 看图说故事

Azure cognitive service: image description- 看图说故事 ...