golang sync.Pool 解析结果

type Pool struct {
noCopy noCopy

local     unsafe.Pointer // poolLocal 类型的slice,内部池子指针
localSize uintptr        //  多少个CPU核心多少个内部池子

// New optionally specifies a function to generate
// a value when Get would otherwise return nil.
// It may not be changed concurrently with calls to Get.
New func() interface{}

}
每个CPU 核对应一个内部 poolLocal 池子。
所以说,看起来你创建了一个池子,其实里面是每个内核对应一个池子,每个核操作自己的池子里面的对象.
池子内的东西 生命期并不是很多人讲的活不过一个回收期,下面我们看一个例子

type myS struct {
	a string
}

var myPool = sync.Pool{New: func() interface{} { return new(myS) }}

func newS() *myS {
	p := myPool.Get().(*myS)
	return p
}

func (p *myS) freeS() {
	myPool.Put(p)
}

func main() {
	var t = newS()
	t.a = "ssss"
	fmt.Println(t.a)
	t.freeS()
	runtime.GC()
	fmt.Println(t.a)

}

在这里插入图片描述只有其他地方没有引用这个东西的时候,池子中的那个东西才会被释放。
实际就是池子中的东西是引用,一次GC中,池子中的引用被释放,东西只有引用=0时才释放

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值