我有两个线程的生产者 - 消费者情况。一个从池中取出对象并将它们放入fifo中,另一个读取对象(一次读取多个),进行计算,将它们从列表中删除并将它们放回池中。 使用ConcurrentLinkedQueue,该模式应该是线程安全的,无需额外的锁。每个对象只写一次,读一次并删除一次。 CLQ中的Add()和Poll()是安全的 a)这是正确的吗? b)哪些其他容器支持这种特定模式?我记得有关LinkedList甚至ArrayList的事情是安全的,因为“getSize()”或“head = ...”会产生一些原子效应,但我不确定也找不到它。
答案 0 :(得分:2)
add
的方法poll
和ConcurrentLinkedQueue
是线程安全的(与所有其他方法一样)。ArrayList
或LinkedList
。根据定义,这些类不是线程安全的:请注意,此实现未同步。如果多个线程同时访问ArrayList实例,并且至少有一个线程在结构上修改了列表,则必须在外部进行同步。
如果您对ConcurrentLinkedQueue
不满意,请查看包java.util.concurrent
中的所有容器实现:
ConcurrentLinkedDeque
(是Queue
)LinkedBlockingQueue
(是BlockingQueue
)LinkedBlockingDeque
(是BlockingDeque
)ArrayBlockingQueue
(是BlockingQueue
)我认为,Queue
或BlockingQueue
是您选择的界面。