如何通过多个线程成功访问和循环ArrayList?

kap*_*kap 2 java arraylist thread-safety

我在ArrayList中需要帮助.我有一个字符串的arraylist.我循环遍历此列表并将它们一个接一个地发送到输出流.当我循环遍历列表并发送它们时,另一个线程可能会向其添加一些元素.发送元素后,也必须从列表中删除它.

我怎样才能成功实现这一目标?

Pét*_*rök 9

如果将项目添加到列表的末尾,则最好使用队列.Java5及更高版本中提供了各种线程安全实现,包括ConcurrentLinkedQueueLinkedBlockingQueue.

一般来说,前者是更好的选择,除非你想要一个有界的阻塞队列,在这种情况下使用后者.


Bal*_*usC 6

为作业使用正确的数据结构.用一个ConcurrentLinkedQueue.以下是它在javadoc中描述自己的方式:

基于链接节点的无界线程安全队列.此队列对元素FIFO(先进先出)进行排序.队列的头部是队列中最长时间的元素.队列的尾部是队列中最短时间的元素.新元素插入队列的尾部,队列检索操作获取队列头部的元素.当许多线程共享对公共集合的访问权限时,A ConcurrentLinkedQueue是一个合适的选择.