编程语言
首页 > 编程语言> > java – 用单线程LMAX编写

java – 用单线程LMAX编写

作者:互联网

我已经了解了LMAX和这个名为RingBuffer的精彩概念.
所以大家告诉我,当只用一个线程写入ringbuffer时,性能比多个生产者更好……

但是,我真的没有发现tipical应用程序只能使用一个线程在ringbuffer上写入…我真的不明白lmax是如何做的(如果他们这样做).例如,N个不同的交易者在交易所下订单,那些都是异步请求,它们被转换为订单并放入ringbuffer,他们怎么可能用一个线程写那些?

问题1.我可能会遗漏某些内容或误解某些方面,但如果您有N个并发生产者,如何将它们合并为1并且不相互锁定?

问题2.我记得rxJava observables,在那里你可以使用N观察者并使用Observable.merge将它们合并为1我想知道它是否阻塞或以任何方式维持任何锁定?

解决方法:

对多线程写入的RingBuffer的影响很小,但在非常重的负载下可能很重要.

RingBuffer实现保存下一个将进行下一个添加的节点.如果只有一个线程写入环,则该过程将始终在最短时间内完成,即buffer [head] = newData.

要在避免锁定的同时处理多线程,通常会执行类似while(!buffer [head] .compareAndSet(null,newValue)){}的操作.这种紧密循环将继续执行,而其他线程正在干扰数据的存储,从而减慢了吞吐量.

请注意,我在上面使用了伪代码,在我的实现here中查看getFree以获得一个真实示例.

  // Find the next free element and mark it not free.
  private Node<T> getFree() {
    Node<T> freeNode = head.get();
    int skipped = 0;
    // Stop when we hit the end of the list
    // ... or we successfully transit a node from free to not-free.
    // This is the loop that could cause delays under hight thread activity.
    while (skipped < capacity && !freeNode.free.compareAndSet(true, false)) {
      skipped += 1;
      freeNode = freeNode.next;
    }
    // ...
  }

标签:java,multithreading,rx-java,disruptor-pattern,lmax
来源: https://codeday.me/bug/20190609/1204804.html