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