Java 并发LinkedList与ConcurrentLinkedQueue
我需要一个并发列表,它是线程安全的,同时对于迭代来说是最好的,并且应该返回准确的大小。 我想存储物品的拍卖出价。所以我希望能够Java 并发LinkedList与ConcurrentLinkedQueue,java,multithreading,concurrency,Java,Multithreading,Concurrency,我需要一个并发列表,它是线程安全的,同时对于迭代来说是最好的,并且应该返回准确的大小。 我想存储物品的拍卖出价。所以我希望能够 检索项目的确切投标数量 向项目添加出价 检索给定项目的所有出价 删除对某个项目的出价 我正计划把它放在一个盒子里 ConcurrentHashMap——LinkedList不是线程安全的,但返回确切的大小 ConcurrentHashMap-concurrentlinked队列是线程安全的,但不保证返回准确的大小 是否有其他更好的集合可以解决上述4点,并且是线程安全的。
ConcurrentHashMap
——LinkedList不是线程安全的,但返回确切的大小
ConcurrentHashMap
-concurrentlinked队列是线程安全的,但不保证返回准确的大小
是否有其他更好的集合可以解决上述4点,并且是线程安全的。可以说,在线程安全的集合或映射中,您无法保证大小的“一致性”,这意味着读写操作之间的“发生之前”关系将不会对您所需的用例有利,其中,大小的读取操作应返回一个值,该值反映上次写入操作的确切状态(N.B.:根据注释进行改进-见下文) 如果性能不是问题,您可以使用以下习惯用法-或者:
Collections.synchronizedMap(新的HashMap())代码>
Collections.synchronizedList(新的ArrayList())代码>
这将确保以阻塞为代价的操作顺序是一致的,并且您应该始终获得最后一个“正确”的大小 您可以使用。它是阻塞的(与CLQ类似),但大小保持不变,不像CLQ那样扫描。使用“精确大小”确切地说是什么意思?线程安全的集合以前确实建立过。这是“线程安全”含义的一个重要部分。我想你想说的是线程安全是不可组合的。也就是说,即使应用程序中的每个对象都是线程安全的,也不能保证应用程序的线程安全。仅仅因为集合是“线程安全”的,并不保证一个应用程序线程放入集合的内容是其他应用程序线程期望在集合中找到的内容。假设此集合是一个大型拍卖系统的一部分,每天有数百万次竞价,那么性能将是一个问题。使用装饰器同步我的收藏会影响性能。@james_large fair point,感谢您的澄清。当我回到家时,我可能应该编辑这个:)@Kar明白了,但是,你为什么在任何给定的时间都需要“精确”的大小?我向你保证,
LinkedBlockingQueue
当然是线程安全的。它说,BlockingQueue实现是线程安全的代码>。