Go 多线程 (4) sync.Pool

sync.Pool 用于缓存

1. pool 可以减少GC对高并发的性能影响
2. 提供了对象重用
3. 并发安全
4. 仅受限于内存大小
5. 减少GC
6. 对象被删除时不会通知
7. 动态扩容或者收缩

package main

 

import (

    "log"

    "sync"

)

 

func main() {

    var intPool = sync.Pool{}

    for i := 0; i < 5; i++ {

        intPool.Put(i)

    }

    log.Println(intPool.Get())

    log.Println(intPool.Get())

    log.Println(intPool.Get())

    log.Println(intPool.Get())

    log.Println(intPool.Get())

    log.Println(intPool.Get())

    log.Println(intPool.Get())

    log.Println(intPool.Get())

    log.Println(intPool.Get())

    log.Println(intPool.Get())

}

上面的例子中如果pool被pop空了, 会直接返回nil

可以通过添加New方法来控制这种行为

package main

 

import (

    "log"

    "sync"

)

 

func main() {

    var intPool = sync.Pool{New: func() interface{} {

        return "Hello world"

    }}

    for i := 0; i < 5; i++ {

        intPool.Put(i)

    }

    log.Println(intPool.Get())

    log.Println(intPool.Get())

    log.Println(intPool.Get())

    log.Println(intPool.Get())

    log.Println(intPool.Get())

    log.Println(intPool.Get())

    log.Println(intPool.Get())

    log.Println(intPool.Get())

    log.Println(intPool.Get())

    log.Println(intPool.Get())

}

interface{}作为Go的重要特性之一,它代表的是一个类似*void的指针,可以指向不同类型的数据