并发LinkedList与ConcurrentLinkedQueue

时间:2016-07-13 16:03:51

标签: java multithreading concurrency

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

  1. 检索商品的确切出价数
  2. 为商品添加出价
  3. 检索给定项目的所有出价。
  4. 删除商品的出价
  5. 我打算把它放进去 ConcurrentHashMap<Item, LinkedList<ItemBid>> - LinkedList不是线程安全的,但返回确切的大小 ConcurrentHashMap<Item, ConcurrentLinkedQueue<ItemBid>> - concurrentlinked队列是线程安全的,但不保证返回确切的大小

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

2 个答案:

答案 0 :(得分:5)

可以说,在线程安全的集合地图中,您无法保证&#34;一致性&#34;大小,意味着&#34;发生之前&#34;读取和写入操作之间的关系不会有益于您期望的用例,其中对大小的读取操作应返回反映上次写入操作的确切状态的值( NB :基于注释改进 - 请参阅下面)。

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

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

然后您还需要明确地同步这些对象。

这将确保操作的顺序以阻塞为代价是一致的,你应该得到最后的&#34;权利&#34;大小随时都有。

答案 1 :(得分:2)

您可以使用LinkedBlockingQueue。它是阻塞的(与CLQ相关)但是大小被维护而不像CLQ一样被扫描。