我有一个许多线程正在写入的数组。然而,每个线程都有一个可以写入的预先分配的索引范围。此外,在所有线程完成之前,不会从数组中读取任何内容。
到目前为止,线程安全。当我需要扩展数组时,问题就出现了,这当然是指将其交换为复制第一个数组的更大数组。这只是偶尔完成(类似于 ArrayList)。
目前,我正在为数组的每次写入获取锁。尽管不需要锁定来保持数组一致,但我必须锁定以防当前正在复制/交换数组。
由于有很多写入,我不想要求它们锁定。我同意这样的解决方案:仅在复制和交换数组时才需要锁定编写器线程,因为这种情况并不常见。
但我不能只在复制/交换正在进行时才施加写锁,因为线程可能已经在向旧数组提交写入。
我认为我需要某种屏障来等待所有写入完成,然后在复制/交换数组时暂停线程。但是 CyclicBarrier 需要我确切地知道当前有多少线程处于活动状态,这并不简单,并且可能容易受到边缘情况的影响,在这种情况下,屏障最终会永远等待,或者过早地降低自身。特别是,我不确定如何在屏障已经启动时处理进入的新线程,或者如何处理当前正在轮询作业队列的线程,因此在没有屏障的情况下永远不会减少屏障计数新工作。
我可能必须实现一些(原子地)计算活动线程并尝试抢占所有边缘情况的东西。
但这很可能是一个我不知道的“已解决”问题,所以我希望可能有一个比循环屏障/线程计数更简单(因此更好)的解决方案。理想情况下,它使用现有的实用程序类。
顺便说一句,我考虑过 CopyOnWriteArray。这对我来说没有用,因为它会为每次写入(很多次)进行复制,而不仅仅是数组扩展。
另请注意,写入的结构几乎必须是数组或基于数组的结构。
谢谢