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

标签 java android multithreading list

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

最佳答案

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

Note that this implementation is not synchronized. If multiple threads access an ArrayList instance concurrently, and at least one of the threads modifies the list structurally, it must be synchronized externally.

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

  • ConcurrentLinkedDeque(是一个队列)
  • LinkedBlockingQueue(是一个BlockingQueue)
  • LinkedBlockingDeque(是一个BlockingDeque)
  • ArrayBlockingQueue(是一个BlockingQueue)

我假设,QueueBlockingQueue 是您选择的接口(interface)。

关于Java(Android),线程安全的FIFO,无需锁定?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26528450/

相关文章:

android - 运行 android : package MoEngage does not exist 时 Moengage 错误的 React-native 设置

Android:更改WindowManager添加的View的LayoutParams

Android 上的 Java FileInputStream/Scanner 问题

java - 是否有类似于 ExecutorService invokeAll 的非阻塞方法?

Java 将负载平衡到许多 JVM 中

Java - KeyListener 多个按钮按下

java - 使用preparedStatement从java中选择*

java - 从选定的对象创建 JSON

java - 检查目录中是否存在文件

python - 当子类化 threading.Thread 时,我是否必须调用 super.join() ?