Java(Android),线程安全FIFO没有锁定?

时间:2014-10-23 12:47:16

标签: java android multithreading list

我有两个线程的生产者 - 消费者情况。一个从池中取出对象并将它们放入fifo中,另一个读取对象(一次读取多个),进行计算,将它们从列表中删除并将它们放回池中。 使用ConcurrentLinkedQueue,该模式应该是线程安全的,无需额外的锁。每个对象只写一次,读一次并删除一次。 CLQ中的Add()和Poll()是安全的 a)这是正确的吗? b)哪些其他容器支持这种特定模式?我记得有关LinkedList甚至ArrayList的事情是安全的,因为“getSize()”或“head = ...”会产生一些原子效应,但我不确定也找不到它。

1 个答案:

答案 0 :(得分:2)

  1. 是的,add的方法pollConcurrentLinkedQueue是线程安全的(与所有其他方法一样)。
  2. 不,直接在并发环境中使用ArrayListLinkedList。根据定义,这些类不是线程安全的:
  3.   

    请注意,此实现未同步。如果多个线程同时访问ArrayList实例,并且至少有一个线程在结构上修改了列表,则必须在外部进行同步。

    如果您对ConcurrentLinkedQueue不满意,请查看包java.util.concurrent中的所有容器实现:

    • ConcurrentLinkedDeque(是Queue
    • LinkedBlockingQueue(是BlockingQueue
    • LinkedBlockingDeque(是BlockingDeque
    • ArrayBlockingQueue(是BlockingQueue

    我认为,QueueBlockingQueue是您选择的界面。