我需要一个线程安全的并发列表,同时最适合迭代并且应该返回精确的大小。 我想存储某个元素的拍卖出价。所以我希望能够
- 检索某个项目的确切出价次数
- 为项目添加出价
- 检索给定商品的所有出价。
- 删除商品的出价
我打算把它放在一个
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/