并发LinkedList与ConcurrentLinkedQueue

ser*_*rah 0 java concurrency multithreading

我需要一个线程安全的并发列表,同时最适合迭代,并且应该返回确切的大小.我想存储商品的竞价出价.所以我希望能够

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

我计划将它放在 ConcurrentHashMap<Item, LinkedList<ItemBid>>- LinkedList不是线程安全的但返回确切的大小 ConcurrentHashMap<Item, ConcurrentLinkedQueue<ItemBid>>- concurrentlinked队列是线程安全的但不保证返回确切的大小

有没有其他更好的集合将解决上述4点并且是线程安全的.

Men*_*ena 5

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

如果性能不是问题,你可以做的是使用以下习语 - 或者:

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

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

这将确保操作顺序以阻塞为代价保持一致,并且您应始终获得最后的"正确"大小.

  • 线程安全的集合确实建立了_happens-before_.这是"线程安全"意味着什么的重要部分.我认为你想说的是线程安全不是_composeable_.也就是说,即使应用程序中的每个对象都是线程安全的,也不会使_application_线程安全.仅仅因为集合是"线程安全的"并不以任何方式保证一个应用程序线程放入集合中的是其他应用程序线程期望在那里找到的内容. (2认同)