企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
## sync.pool 获取对象: ![](https://img.kancloud.cn/26/f5/26f564133763a6858133ceff39d6588b_1648x780.png) 放回对象: ![](https://img.kancloud.cn/11/01/1101e56efec1757297f91c8332068019_1636x640.png) ### sync.Pool对象生命周期 * GC会清楚sync.pool缓存的对象 * 对象的缓存有效期为下一次GC之前 ### sync.poll适用场景 * 适用于通过复用能降低复杂对象的创建和GC代价 * 协程安全会有锁的开销 * 生命周期受GC影响,不适合做连接池等需要自己管理生命周期的资源的池化 示例: ~~~ func TestSyncPool1(t *testing.T) { pool := sync.Pool{New: func() interface{} { obj := 88 fmt.Println("create object:", obj) return obj }, } v := pool.Get().(int) fmt.Println("Get object :", v) pool.Put(77) // 取出来后如果不放回,则对象池中为空 runtime.GC() // GC会清楚sync.pool中缓存的对象,注意gc和JAVA中的GC一样,不应该手动调用,此处仅为演示效果 v = pool.Get().(int) fmt.Println("Get object :", v) } func TestSyncPool2(t *testing.T) { pool := sync.Pool{New: func() interface{} { obj := 88 fmt.Println("create object:", obj) return obj }, } pool.Put(100) pool.Put(101) pool.Put(102) var wg sync.WaitGroup for i := 0; i < 10; i++ { wg.Add(1) go func() { obj := pool.Get().(int) fmt.Println("get object:", obj) wg.Done() }() } wg.Wait() } ~~~