Golang中Sync.Pool详解及使用方法

开发 前端
在Golang的很多标准库和很多知名的开源库中,都可以看到大量使用sync.Pool的场景。例如encoding/json包中的Valid方法使用sync.Pool创建scanner对象,Gin框架使用sync.Pool来复用每个请求都会创建的gin.Context对象。

什么是sync.Pool?

sync.Pool是用来保存可以被重复使用的临时对象,以便在以后的同类操作中可以重复使用,从而避免了反复创建和销毁临时对象带来的消耗以及对GC造成的压力。常用池化技术来提高程序的性能,例如连接池、线程池等。sync.Pool是并发安全的,可以在多个goroutine中并发调用sync.Pool存取对象。

在Golang的很多标准库和很多知名的开源库中,都可以看到大量使用sync.Pool的场景。例如encoding/json包中的Valid方法使用sync.Pool创建scanner对象,Gin框架使用sync.Pool来复用每个请求都会创建的gin.Context对象。

但需要注意的是,sync.Pool保存的对象随时可能在不发出通知的情况下被清除,因此不能使用sync.Pool存储需要持久化的对象。

sync.Pool使用方法

首先看一段示例代码:

package main

import "sync"

type scanner struct {
	Name string
}

func main() {
	pool := sync.Pool{
		New: func() interface{} {
			return &scanner{
				Name: "json",
			}
		},
	}

	scan := pool.Get().(*scanner)
	println(scan.Name)
	pool.Put(scan)
}

初始化sync.Pool的时候,需要提供一个对象的构造函数New。使用Get从对象池中获取对象,使用Put将对象放回到对象池。

可以看出sync.Pool的使用方法非常简单,对外只提供三个方法:New、Get和Put

  • New方法,使用Get方法从对象池中获取对象的时候,对象池中如果没有,会调用New方法创建一个新的对象。
  • Get方法,从对象池中获取一个对象。
  • Put方法,将对象放回到对象池,下次Get的时候可以复用。

小结

本文介绍了sync.Pool的作用和使用方法,下篇文章深入源码解析sync.Pool。

责任编辑:姜华 来源: 今日头条
相关推荐

2023-06-28 08:34:02

Bind()函数JavaScript

2010-10-09 10:30:03

JS event

2023-06-05 09:23:00

Golang同步工具

2023-06-26 08:28:35

Sync.CondGolang

2023-06-06 08:28:58

Sync.OnceGolang

2023-11-10 08:17:01

分布式搜索引擎

2023-07-03 15:55:05

语法jpa状态

2023-07-26 08:58:45

Golang单元测试

2012-05-10 10:53:10

Linuxhistory

2009-12-28 13:28:03

WPF视频

2017-08-18 14:01:44

大数据dataWrangle

2023-04-28 07:56:09

2009-06-29 17:57:30

ApplicationJSP

2012-05-09 10:52:37

Linux监控命令

2019-11-07 23:48:12

shell脚本getopts

2011-09-06 09:26:03

2010-06-03 17:38:03

Hadoop命令

2010-06-01 19:55:30

SVN使用

2010-01-28 17:07:03

Android Gal

2009-12-02 16:04:44

PHP fsockop
点赞
收藏

51CTO技术栈公众号