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

Java(Android),线程安全FIFO,无锁定?,java,android,multithreading,list,Java,Android,Multithreading,List,我有一个生产者消费者的情况,正好有两个线程。一个从池中提取对象并将其放入fifo,另一个读取对象(一次多次),进行计算,将其从列表中删除并将其放回池中。 使用ConcurrentLinkedQueue,该模式应该是线程安全的,不需要额外的锁。每个对象只写入一次、读取一次和删除一次。添加()和轮询()在CLQ中是安全的。 a) 这是正确的吗? b) 其他哪些容器支持此特定模式?我记得LinkedList甚至ArrayList是安全的,因为“getSize()”或“head=…”有一些原子效应,但我

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

  • 是的,
    ConcurrentLinkedQueue
    的方法
    add
    poll
    是线程安全的(与所有其他方法一样)
  • 否,请勿在并发环境中直接使用
    ArrayList
    LinkedList
    。根据定义,这些类不是线程安全的:
  • 请注意,此实现未同步。如果多个线程同时访问ArrayList实例,并且至少有一个线程在结构上修改了列表,则必须在外部对其进行同步

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

    • concurrentlinkedque
      (是一个
      队列
    • LinkedBlockingQueue
      (是一个
      BlockingQueue
    • LinkedBlockingDeque
      (是一个
      阻塞deque
    • ArrayBlockingQueue
      (是一个
      阻塞队列

    我假设
    Queue
    BlockingQueue
    是您选择的界面。

    了解并发错误最重要的一点是,有缺陷的程序可能会在某些时间工作,甚至可能在某些环境中一直工作。你不能指望测试。因此,避免麻烦的最佳方法是阅读文档并遵守规则。标准ArrayList和LinkedList类的javadoc明确表示它们不是线程安全的。关于线程/并发性的评论是正确的。IMHO,如果fifo push/pop方法是原子的,那么应该可以。不过,您需要确保不会出现与池相关的并发问题(即对象在任何时候都由单个实体/线程控制)。谢谢。我正在使用ConcurrentLinkedQueue。只是我很确定在ArrayList或LinkedList上甚至有一个主题,在严格的生产者-消费者2线程模式下,它们是安全的。然而从源头上看,我看不出它是如何安全的。