sync.Pool的意义何在? 取值的顺序都是打乱的?

var chi sync.Pool

chi.Put(10)
chi.Put(50)
chi.Put(100)
chi.Put(200)
chi.Put(600)
chi.Put(400)
chi.Put(500)

Println(chi.Get())
Println(chi.Get())
Println(chi.Get())
Println(chi.Get())
Println(chi.Get())
Println(chi.Get())
Println(chi.Get())

get()结果是打乱的;
还是不明白Pool的意义何在? 看了很多文章了;

另外问下, 如何手动释放一个变量的内存?
go也没有delete函数啊;

求老鸟讲解下,Pool具体使用场景?



var chi sync.Pool
var a int = 10000
chi.Put(a)
Println(a)
Println(chi.Get())
Println(a)
再看看这个,也没释放a;内存还是占用的!!!

共 5 个回复


aaa

看懂我就不问了

# 1

stevewang

sync.Pool就是一个线程安全的对象缓冲池,可以获取和回收对象,缓冲池的大小会自动管理,避免过多的对象占用过多的内存。通过对缓冲池中对象的重复使用,以达到减少GC压力提高性能的目的。
如果应用场景中需要分配大量对象短暂使用之后就抛弃,就比较适合使用sync.Pool
注意,缓冲池只用于内存对象,不能用于文件和网络连接等资源,而且获取到的对象有可能是没有初始化的。

# 2

damao

缓冲池为什么要关心存取顺序?你想要的是栈或是队列吧?

# 3

kaixinmao

应用场景理解是大量分配销毁内存对象,有点像C先自己分配一大块内存,自己代码管理内存块的感觉。

# 4