为什么Java中没有任何并发数组[非阻塞]队列?

为什么Java中没有任何并发数组[非阻塞]队列?,java,queue,core,java.util.concurrent,Java,Queue,Core,Java.util.concurrent,存在ConcurrentLinkedQueue,但没有ConcurrentArrayQueue非阻塞队列。 有ArrayBlockingQueue但是如果我不需要阻塞功能,我只想要一个队列呢 这是并发的-我有一个多线程应用程序 基于数组-顺便说一句,基于数组优于链接(由于System.arraycopy()),并且链接没有固有的开销 非阻塞-我只是不需要这个功能 那么,什么是最佳选择?您最常在此阵列上使用的操作是什么?例如,如果您经常遍历数组,但很少修改,请查看CopyOnWriteArray。

存在
ConcurrentLinkedQueue
,但没有
ConcurrentArrayQueue
非阻塞队列。 有
ArrayBlockingQueue
但是如果我不需要阻塞功能,我只想要一个队列呢

  • 这是并发的-我有一个多线程应用程序
  • 基于数组-顺便说一句,基于数组优于链接(由于System.arraycopy()),并且链接没有固有的开销
  • 非阻塞-我只是不需要这个功能

  • 那么,什么是最佳选择?

    您最常在此阵列上使用的操作是什么?例如,如果您经常遍历数组,但很少修改,请查看CopyOnWriteArray。一般来说,并发数组在所有情况下都是不好的。为什么需要一个数组支持的队列?队列的全部要点是它是FIFO,所以不管怎样,它不像数组支持的那样需要随机访问。队列是FIFO-您从尾部写入,从头部读取。但如果这是由一个数组支持的话:写操作很便宜。但是reads()要求您从数组[0]中读取,并将所有项移动一个位置(或者更糟的是,将插槽保留为未使用)。也许您正在考虑循环缓冲区?@Daniele如果您查看ArrayBlockingQueue,它不会移动项目,它只保留两个指针来引用“head”(
    takeIndex
    )和“tail”(
    putIndex
    )并将其视为循环数组。阻塞方面来自于当您尝试添加到“完整”队列时,它将阻塞而不是调整数组大小,因此不会有任何数组开销。