作者回复: 你使用的是那个版本呢? 官方Go runtime 1.13将对sync.Pool中的对象回收时机策略做出调整。在1.12版本及以前的版本中,在每轮垃圾回收过程中,每个sync.Pool实例中的所有缓存对象都将被无条件回收掉。从1.13版本开始,如果一个sync.Pool实例在上一轮垃圾回收过程结束之后仍然被使用过,则其中的缓存对象将不会被回收掉。此举对于使用sync.Pool来提升效率的程序来说,将大大减少周期性的因为缓存被清除而造成的瞬时效率下降。
作者回复: 第一个 Get取出的是私有池中的,私有池仅可放一个对象 后面的Get取出的则是共享池中的,而共享池的是后进先出的。可以参考sync.pool的源代码: func (p *Pool) Get() interface{} { if race.Enabled { race.Disable() } l := p.pin() x := l.private l.private = nil runtime_procUnpin() if x == nil { l.Lock() last := len(l.shared) - 1 if last >= 0 { x = l.shared[last] l.shared = l.shared[:last] }
作者回复: 这个就是在函数课程中提到,方法在Go中方法是第一公民,所以New是结构体中一个变量,而这个变量的值是个方法。这里你把自定义的方法作为变量值付给了New
作者回复: 没错。其实每一节课都应该这样
作者回复: 官方Go runtime 1.13后对sync.Pool中的对象回收时机策略做出调整。在1.12版本及以前的版本中,在每轮垃圾回收过程中,每个sync.Pool实例中的所有缓存对象都将被无条件回收掉。从1.13版本开始,如果一个sync.Pool实例在上一轮垃圾回收过程结束之后仍然被使用过,则其中的缓存对象将不会被回收掉。此举对于使用sync.Pool来提升效率的程序来说,将大大减少周期性的因为缓存被清除而造成的瞬时效率下降。
作者回复: 我认为这个是由于在Go1.13版本后引入了victim cache机制的原因,每一次GC并不一定会销毁所有缓存对象。这样的好处是: 1. 减少回收对象的数量,缩短GC时间 2. 提高缓存的命中率
作者回复: 其实在我的总结里提到了,sync.Pool是可以在多协程的情况下使用的,但是在访问共享池时,会有锁的开销。 -协程安全,会有锁的开销