Reactor3在BUFFER背压策略下,当Publisher发布元素后会先到一个缓存队列中,然后由生产者推送或者消费者拉取。SpscLinkedArrayQueue就是这其中的队列。在JDK9中引入了响应式的接口Flow,在JDK中有一个Flow.Publisher的实现SubmissionPublisher。SubmissionPublisher的背压就很简单,使用的队列是一个Object数组。
那为什么Reactor3不使用简单的Object数组呢,要去另辟蹊径实现另外的一个队列?
数组在数据到达一定规模后需要扩容和缩容,就这一个问题就已经很致命了。在高并发情况下消息很容易堆积,数组就不得不频繁的进行扩容,数组扩容也就意味着会有元素进行复制,如果元素较多很容易成为性能瓶颈。
既然受到扩容和缩容的困扰为何不使用链表,这样不就是无限大吗?并且不用处理扩容和缩容的问题,链表的头尾插入和删除的时间复杂度都是O(1)性能也不拉胯。
确实可以,但是链表的性能在实际机器上跑起来确实不太行,最近某些公众号还有推LinkedList的作者都不使用它