我需要一个线程安全的并发列表,同时最适合迭代,并且应该返回确切的大小。 我想存储商品的竞价出价。所以我希望能够
我打算把它放进去
ConcurrentHashMap<Item, LinkedList<ItemBid>>
- LinkedList不是线程安全的,但返回确切的大小
ConcurrentHashMap<Item, ConcurrentLinkedQueue<ItemBid>>
- concurrentlinked队列是线程安全的,但不保证返回确切的大小
还有其他更好的集合可以解决上述4点并且是线程安全的。
答案 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一样被扫描。