工作生活

(十) golang 临时对象池

2019-07-01  本文已影响0人  杰克慢

为什么Pool中需要这么多poolLocal对象呢?实际上,Pool是给每个线程分配了一个poolLocal对象。也就是说local数组的长度,就是工作线程的数量(size := runtime.GOMAXPROCS(0))。当多线程在并发读写的时候,通常情况下都是在自己线程的poolLocal中存取数据。当自己线程的poolLocal中没有数据时,才会尝试加锁去其他线程的poolLocal中“偷”数据。

package main

import (
    "fmt"
    "sync"
)

func main() {
    p := &sync.Pool{
        New: func() interface{} {
            return 0
        },
    }

    a := p.Get().(int)
    p.Put(1)
    p.Put(2)
    b := p.Get().(int)
    d := p.Get().(int)
    fmt.Println(a, b, d)
}
0 1 2
package main

import (
    "fmt"
    "runtime"
    "sync"
)

func main() {
    p := &sync.Pool{
        New: func() interface{} {
            return 0
        },
    }

    a := p.Get().(int)
    p.Put(1)
    runtime.GC()
    b := p.Get().(int)
    fmt.Println(a, b)
}
0 0

https://www.jb51.net/article/150769.htm

https://www.jianshu.com/p/2bd41a8f2254

上一篇 下一篇

猜你喜欢

热点阅读