• 到不了的塔
    2018-11-17
    临时对象池初始化时指定new字段对应的函数返回一个新建临时对象;
    临时对象使用完毕时调用临时对象池的put方法,把该临时对象put回临时对象池中。
    这样就能保证一个临时对象池中总有比较充足的临时对象。
    
     6
  • 数字记忆
    2019-11-20
    这个代码很形象:

    package main

    import (
        "fmt"
        "sync"
        "time"
    )

    // 一个[]byte的对象池,每个对象为一个[]byte
    var bytePool = sync.Pool{
        New: func() interface{} {
            b := make([]byte, 1024)
            return &b
        },
    }

    func main() {
        a := time.Now().Unix()
        fmt.Println(a)
        // 不使用对象池
        for i := 0; i < 1000000000; i++{
            obj := make([]byte,1024)
            _ = obj
        }
        b := time.Now().Unix()
        fmt.Println(b)
        // 使用对象池
        for i := 0; i < 1000000000; i++{
            obj := bytePool.Get().(*[]byte)
            _ = obj
            bytePool.Put(obj)
        }
        c := time.Now().Unix()
        fmt.Println(c)
        fmt.Println("without pool ", b - a, "s")
        fmt.Println("with pool ", c - b, "s")
    }

    // run时禁用掉编译器优化,才会体现出有pool的优势
    // go run -gcflags="-l -N" testSyncPool1.go
    展开
    
     2
  • 闫飞
    2019-07-17
    这里存放的临时对象是否是无状态,无唯一标识符的纯值对象? 对象的类型是否都是一样,还是说必须要用户自己做好具体类型的判定?

    作者回复: 你放在一个池子里的实例最好是一个类型的,要不后面用的时候会很麻烦。

    
     1
  • 张sir
    2019-05-21
    还有一个问题,如果多goruntine同时申请临时对象池内资源,所有goruntine都可以同时获取到吗,还是只能有一个goruntine获取到,其它的goruntine都阻塞,直到这个goruntine释放完后才能使用

    作者回复: 我大概明白你的意思。这篇文章你可能还没有仔细看。

    你需要先搞清楚(以下内容在文章里都有):

    在涉及到本地池的 shared 字段的时候会有锁,但是这种锁是分段锁,也就是说,每个本地池都会有自己的锁。

    因此,在对应某个 P 的本地池的锁处于锁定状态的时候,所有正试图访问(不论是 Get 还是 Put)这个本地池的 goroutine 都会被阻塞。

    一个临时对象池拥有的本地池的数量与 P 的数量相同。所以,即使有 goroutine 因此被阻塞,往往也只是少数。又因为分段锁的缘故,它们被锁住的时间一般也是很短暂的。

    当你知道了这些,你就会明白,临时对象池在并发访问方面是很高效的。

    再结合我在专栏里揭示的访问步骤和细节,你应该就可以搞懂你问的问题了。

    
     1
  • 来碗绿豆汤
    2018-10-28
    是不是临时对象池里面最多有2p个临时对象
    
     1
  • 苏安
    2018-10-26
    老师,不知道还有几讲,最初的课程大纲有相关的拾遗章节,不知道后续的安排还有没?

    作者回复: 我会讲完的,放心,预计45讲左右。

    
     1
  • Alan
    2020-01-10
    threalocal 有点像,只不过pool的垃圾回收是系统处理,哦,另外还多了个共享列表,哈哈
    
    
  • 虢國技醬
    2020-01-09
    go1.13对本地池的shared共享列表做了存储结构变更,改为双向链表(在shared的头部存,尾部取),取消锁以提高性能
     1
    
  • 疯琴
    2020-01-02
    请问老师,demo70 的 37 行 return 后面没跟东西,是相当于 return nil 么?

    作者回复: 不是,是返回结果变量err的值。

     1
    
  • 虢國技醬
    2019-11-29
    二刷
    
    
  • benying
    2019-06-13
    打卡,讲的蛮清楚了
    老师的课程难度比较适中,挺好的
    
    
  • 张sir
    2019-05-21
    你好,请问put一个不存在的临时对象池会引发别的问题吗

    作者回复: 你说的“不存在”是什么意思?

    
    
  • 时间的奴隶
    2019-04-16
    请教老师一个问题: Get方法从临时对象池中取走一个私有临时对象时, 会不会把自己的共享临时对象列表中的临时对象转移一个为私有临时对象, 以方便下一个Get方法调用? 从文中的内容看, 应该是不会的

    作者回复: Get 的时候只会想法设法拿到一个临时对象,而不会移动任何对象。

    
    
  • 虢國技醬
    2019-03-01
    打卡😘ོ
    
    
  • Supetsnail
    2018-11-25
    这个怎么做一下benchmark验证下效率?
    
    
  • Supetsnail
    2018-11-25
    这个怎么能做一个benchmark对比?
    
    
我们在线,来聊聊吧