• Juc
    2019-05-30
    希望老师解释下,为什么创建元素的时间离散会导致元素的内存地址不是连续的?这些元素不是存在数组中的吗?数组初始化不是已经连续分配内存了吗?

    作者回复: 数组连续,数组里只有引用,e1 e2这些对象的地址不连续

     1
     14
  • 孙志强
    2019-05-30
    程序局部性原理的空间局部性是不是cpu分支预测?缓存行一般是64字节,takeIndex那为何前后填充56个字节,大于64了,怎么独占缓存行?
     1
     8
  • 锦
    2019-05-30
    disruptor高性能主要是以下几点设计:
    1,仅维护一个共享变量(入队索引),减少锁竞争,并利用填充行技术解决共享变量的伪共享问题。
    2,底层使用循环数组作为存储结构,开辟一组连续的内存空间,循环利用减少gc次数,并充分利用了程序局部性原理。
    3,入队时支持一次性获取多个索引,然后在当前线程写入数据,减少锁竞争,消费时一样。
    不知道我理解的对不对?
    
     4
  • LW
    2019-05-30
    RingBuffer是一个环形队列?
    
     4
  • 冰激凌的眼泪
    2019-07-03
    前后56个字节保证了目标字段总是独占一个cache line,不受周围变量缓存失效的影响

    作者回复: 👍

    
     3
  • 郑晨Cc
    2019-06-05
    全他妈的是干货 满足!
    
     2
  • 爱吃回锅肉的瘦子
    2019-06-01
    难度指数提升😔只能得多看几遍
    
     2
  • kennyji
    2020-01-18
    太赞了!!
    
     1
  • 晓杰
    2019-05-30
    mysql也利用了程序的局部性原理来减少磁盘的io,百度开源的分布式唯一id生成器也使用了RingBuffer,将提前生成的id缓存到RingBuffer中。
    
     1
  • 张三
    2019-05-30
    打卡!
    
     1
  • 放个屁臭到了自己
    2019-11-26
    “ArrayBlockingQueue 的入队和出队操作是用锁来保证互斥的,所以入队和出队不会同时发生。如果允许入队和出队同时发生,那就会导致线程 A 和线程 B 争用同一个缓存行,这样也会导致性能问题。所以为了更好地利用缓存,我们必须避免伪共享,那如何避免呢?”

    JMM关于synchronized的两条规定:
      1)线程解锁前,必须把共享变量的最新值刷新到主内存中
      2)线程加锁时,将清空工作内存中共享变量的值,从而使用共享变量时需要从主内存中重新获取最新的值

    这样来看,由于 cpu 读取数据是按照缓存行读取的,那么虽然加锁了,但还是会按照缓存行读取啊,如果我加锁后访问了多个变量,后面依然会全部读取进来吧。

    这种情况不是也是伪共享嘛??依然是有性能问题的吧。。。

    那对于加锁的情况,使用缓存行填充是否也可以优化性能呢?
    展开
    
    
  • 放个屁臭到了自己
    2019-11-26
    ArrayBlockingQueue 的入队和出队操作是用锁来保证互斥的,所以入队和出队不会同时发生。如果允许入队和出队同时发生,那就会导致线程 A 和线程 B 争用同一个缓存行,这样也会导致性能问题。

    想问下加锁了就没有缓存干扰了吗!为啥?

    作者回复: 缓存导致的可见性问题靠的是HB规则,锁是靠HB规则解决缓存问题的

    
    
  • aoe
    2019-11-22
    第一次知道伪共享
    
    
  • xinglichea
    2019-08-29
    老师,感觉填充的模式不是很靠谱,程序的健壮性要强依赖于CPU的缓存行的实现,打个比如,如果以后CPU缓存行变成了128个字节,那企不要写Disruptor的实现源码,然后原来实现的代码仍然会有伪共享的问题!!!

    作者回复: 我觉得从官方提供注解这一行为来看,应该不至于不靠谱,不过java程序员都习惯于不关注硬件。

    
    
  • neohope
    2019-08-18
    有个地方没看懂,if (wrapPoint>cachedGatingSequence || cachedGatingSequence>current),这个条件里面,为何需要cachedGatingSequence>current这个限制呢?
    是当current突破最大值变为0之后,要等到cachedGatingSequence追上来才继续生产吗?
    
    
  • 青铜5 周群力
    2019-07-31
    对内存优化部分有质疑:
    1申请内存要经过jvm,经过操作系统,经过层层的优化、内存管理,填充缓存行有没有用只靠逻辑推理是推理不出来的吧,有没有数据证明这个技术真的有用?
    2.预先申请所有元素对象真的有用吗,因为每个元素引用的数据对象还在离散的内存空间,取数据对象还要访问内存,会发生cache line淘汰。所以有什么数据能证明这个技术有用吗
    
    
  • 小予
    2019-07-30
    关于第4点,批量消费,一个线程一次读取n个元素,那另外一个线程想要读取元素时,必须等前一个线程的n个元素读取完,不明白这样为何能提高性能,希望老师解答下
    
    
  • 空知
    2019-06-09
    老师问下
    缓存行填充之后,缓存行里加载的不是真实需要的数据 是填充数据 程序局部性会不会不适用了?

    作者回复: 适用,只是避免一个缓存行内互相干扰而已

    
    
  • nico
    2019-06-07
    老师,问下,多个生产者同时生产时,如果前面申请成功但是生产失败了,后面的生产成功了,中间空出来的位置怎么处理?
    
    
  • 在下令狐冲
    2019-06-03
    缓存行填充可以看看这篇文章,简单明了
    http://ifeve.com/disruptor-cacheline-padding/
    
    
我们在线,来聊聊吧