是否有 Java CopyOnWriteArrayList 实现的改进替代方案以及如何请求更改 Java 规范?

Bri*_*ian -1 java copyonwritearraylist

CopyOnWriteArrayList 几乎具有我想要的行为,如果删除不必要的副本,它将正是我正在寻找的。特别是,它可以像 ArrayList 一样在 ArrayList 末尾进行添加 - 即,没有理由每次都创建一个新副本,这是非常浪费的。它实际上可以限制 ArrayList 的末尾来为读者捕获快照,并在添加新项目后更新末尾。

这种增强似乎是值得拥有的,因为对于许多应用程序来说,最常见的添加类型是添加到 ArrayList 的末尾 - 这甚至是选择使用 ArrayList 的一个原因。

也不会有额外的开销,因为它只能在附加时不复制,尽管它仍然需要检查是否需要重新调整大小,但 ArrayList 无论如何都必须这样做。

  1. 是否有任何替代实现或数据结构具有这种行为,而无需在末尾添加不必要的副本(即,线程安全且经过优化以允许频繁读取,而写入仅在列表末尾添加)?

  2. 如何提交更改请求以请求对 Java 规范进行更改,以消除在 CopyOnWriteArrayList 末尾添加的副本(除非需要重新调整大小)?

我真的很希望看到核心 Java 库对此进行更改,而不是维护和使用我自己的自定义代码。

ysh*_*vit 5

听起来您正在寻找BlockingDeque,特别是ArrayBlockingQueue.

您可能还需要一个ConcurrentLinkedQueue,它使用“无等待”算法(也称为非阻塞),因此在许多情况下可能会更快。它只是 a Queue(不是 a Dequeue),因此您只能在集合的头部插入/删除,但听起来这可能适合您的用例。但为了换取无等待算法,它必须在内部使用链表而不是数组,这意味着更多的内存(包括弹出项目时更多的垃圾)和更差的内存局部性。无等待算法还依赖于比较和设置(CAS) 循环,这意味着虽然在“正常”情况下速度更快,但在高争用情况下实际上可能会更,因为每个线程之前都需要多次尝试其 CAS它获胜并能够继续前进。

我的猜测是,列表没有受到那么多人喜爱的原因java.util.concurrent是,在其他迭代的大多数用例中,列表本质上是一种活泼的数据结构。例如,类似的东西if (!list.isEmpty()) { return list.get(0); }除非被块包围,否则是活泼的synchronized,在这种情况下,您不需要本质上线程安全的结构。您真正需要的是一个“列表类型”接口,它只允许在末尾进行操作——而这正是 和Queue的本质Deque