java - 并发 LinkedList 与 ConcurrentLinkedQueue

标签 java multithreading concurrency

我需要一个线程安全的并发列表,同时最适合迭代并且应该返回精确的大小。 我想存储某个元素的拍卖出价。所以我希望能够

  1. 检索某个项目的确切出价次数
  2. 为项目添加出价
  3. 检索给定商品的所有出价。
  4. 删除商品的出价

我打算把它放在一个 ConcurrentHashMap<Item, LinkedList<ItemBid>> -- LinkedList不是线程安全的,但返回精确的大小 ConcurrentHashMap<Item, ConcurrentLinkedQueue<ItemBid>> -并发链接队列是线程安全的,但不保证返回精确的大小

是否有其他更好的集合可以解决上述 4 点并且是线程安全的。

最佳答案

可以说,在线程安全的集合映射中,您无法保证大小的“一致性”,这意味着读取和写入操作之间的“发生之前”关系不会有利于您的期望用例,其中对大小的读取操作应返回一个反射(reflect)上次写入操作的确切状态的值(注意:根据注释进行改进 - 见下文)。

如果性能不是问题,您可以使用以下习惯用法 - 之一:

  • Collections.synchronizedMap(new HashMap<YourKeyType, YourValueType>());
  • Collections.synchronizedList(new ArrayList<YourType>());

然后,您还需要显式同步这些对象。

这将确保操作顺序保持一致,但会造成阻塞,并且您应该始终获得最后的“正确”大小。

关于java - 并发 LinkedList 与 ConcurrentLinkedQueue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38356636/

相关文章:

java - Android Studio 构建错误 : More than one file was found with OS independent path 'META-INF/gfprobe-provider.xml'

带有循环的 Java 文本到 ASCII 转换器

c++ - 使用类对象提升线程 worker

c++ - 保护多线程访问的类实例

java - 有人可以解释一下standalone.xml中 '${'和 ':'的语法吗?

java - hibernate : Constraint violation when flushing just before saving

multithreading - Delphi:系统错误1158的原因(当前进程没有更多的系统句柄)

Android:哪个线程调用.onSensorChanged?

multithreading - 是否应该使用像 Akka 这样的基础设施来包装阻塞调用(到关系数据库)?

java - 处理线程最大执行时间的最佳方法(在 Java 中)