当前位置: 首页 > 知识库问答 >
问题:

并发LinkedList与并发LinkedQueue

查飞星
2023-03-14

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

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

我打算把它放在ConcurrentHashMap中

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


共有2个答案

叶淇
2023-03-14

您可以使用LinkedBlockingQueue。它是阻塞的(与CLQ相反),但大小保持不变,不像CLQ那样被扫描。

季嘉良
2023-03-14

可以说,在线程安全的集合或映射中,你不能保证大小的“一致性”,这意味着读和写操作之间的“先发生后”关系不会对你想要的用例产生任何好处,在这种情况下,对大小的读操作应该返回一个反映上次写操作的确切状态的值(注意:根据注释进行了改进,见下文)。

如果性能不是问题,您可以做的是使用以下习语 - 要么:

  • 集合。synchronizedMap(新HashMap

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

这将确保以阻塞为代价的操作顺序是一致的,并且您应该始终获得最后一个“正确”的大小。

 类似资料:
  • 并发(Concurrently)和并行(Parallel)是两个不同的概念。借用Go创始人Rob Pike的说法,并发不是并行,并发更好。并发是一共要处理(deal with)很多事情,并行是一次可以做(do)多少事情。 举个简单的例子,华罗庚泡茶,必须有烧水、洗杯子、拿茶叶等步骤。现在我们想尽快做完这件事,也就是“一共要处理很多事情”,有很多方法可以实现并发,例如请多个人同时做,这就是并行。并行

  • 类似于同步 方式的Iterator,这里有很多不同的方法可以迭代和处理一个Stream中的值。有组合器样式的方法,例如map,filter和fold和他们的有错误就早退的表弟try_map,try_filter和try_fold。 不幸,for循环不适用于Streams,但对于命令式代码,while let和next/try_next函数可以这样用: async fn sum_with_next(

  • 9.3.1 串行、并发与并行 计算机执行程序时,如果采用按顺序执行的方式,即仅当一个程序执行完毕,下一个程序才能开始执行,则称为串行(serial)执行。在串行执行方式下,CPU 每次由一个程序独 占使用,只要当前程序还没有结束,下一个程序就不能使用 CPU。这就像排队买东西,营 业员(即 CPU)每次只为一个顾客服务,等前面的顾客走了,后面的顾客才能获得服务。 串行执行方式有一个缺点,即 CPU

  • 并发和并行都用于多线程程序,但是它们之间的相似性和差异存在很多混淆。 这方面的一个重要问题是:并发并行性与否? 尽管这两个术语看起来非常相似,但上述问题的答案是否定的,但并发性和并行性并不相同。 现在,如果它们不相同,那么它们之间的基本区别是什么? 简单来说,并发性涉及管理来自不同线程的共享状态访问,另一方面,并​​行性涉及利用多个CPU或其核心来提高硬件性能。 并发细节 并发是指两个任务在执行时

  • 考虑以下方法: 尤其是这两条线: 如果线程A进入synchronized块并获得当前对象的锁,这是否意味着该对象的实例属性的状态不能被synchronized块之外的其他线程改变(当线程A在synchronized块中时)? 例如,线程A执行了第1行- 消息是非静态同步列表 UPD:更新的方法,可能的解决方案: addLock - AtomicBoolean,默认为false

  • Rust 的并发模型中一个有趣的方面是:语言本身对并发知之 甚少。我们之前讨论的几乎所有内容,都属于标准库,而不是语言本身的内容。由于不需要语言提供并发相关的基础设施,并发方案不受标准库或语言所限:我们可以编写自己的或使用别人编写的并发功能。 然而有两个并发概念是内嵌于语言中的:std::marker 中的 Sync 和 Send trait。 Send 标记 trait 表明类型的所有权可以在线