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

并发集合大小计算

华景焕
2023-03-14

Java标准库中的大多数集合(如ConcurrentLinkedQueue、Concurrent LinkedDequeue和ConcurrntSkipListSet)的文档都附带以下免责声明:

注意,与大多数集合不同,size方法不是一个恒定时间的操作。由于这些集合的异步性质,确定元素的当前数量需要遍历元素,因此如果在遍历过程中修改了集合,可能会报告不准确的结果。

那是什么意思?为什么他们不能保留一个计数器(比如说,一个原子整数器),而只是将调用的值返回到 size()?

是因为计数器必须同步,因此会产生阻塞点吗?

作为旁注,并发哈希地图似乎没有此问题。为什么?查看源代码,它似乎使用了保存在数组中的多个计数器,这些计数器在调用 size() 时求和。这是为了规避阻塞点还是有其他原因?

共有1个答案

岳凯康
2023-03-14

使用共享资源来维护size()既昂贵又无用。< code>size()很可能一返回就不正确,因为您不能持有集合上的锁,所以它可能会在您调用它和获取值之间发生变化。

ConcurentHashMap也有同样的方法。在方法返回之前,大小()可能不正确。

 类似资料:
  • {应用程序:“ABC”,日期:time.now,状态:“1”user_id:[id1,id2,id4]} {应用程序:“ABC”,日期:time.listerment,状态:“1”,user_id:[id1,id3,id5]} {应用程序:“ABC”,日期:time.ystayday-1,状态:“1”,user_id:[id1,id3,id5]} 我目前正在使用聚合框架并计算MongoDB之外的I

  • scard key 如果set是空或者key不存在返回0

  • 问题内容: 有没有一种方法可以在不初始化的情况下计算关联集合的大小? 例如 (由于我的where子句更加复杂,而from子句是多态查询,所以我不能以任何其他方式执行此操作是有充分的理由的) 谢谢。 问题答案: 除查询外,可能的解决方案可能是使用(使用XML表示法)映射。这样,您可以使用所需的任何查询来获取Parent,然后在不加载整个集合的情况下进行调用(仅执行类型查询)。 有了注释,它将是 更新

  • 前言 HashMap是我们平时开发过程中用的比较多的集合,但它是非线程安全的,在涉及到多线程并发的情况,进行put操作有可能会引起死循环,导致CPU利用率接近100%。 final HashMap<String, String> map = new HashMap<String, String>(2); for (int i = 0; i < 10000; i++) { new Threa

  • 前言 在前面的文章ArrayBlockingQueue中,已经对JDK中的BlockingQueue中的做了一个回顾,同时对ArrayBlockingQueue中的核心方法作了说明,而LinkedBlockingQueue作为JDK中BlockingQueue家族系列中一员,由于其作为固定大小线程池(Executors.newFixedThreadPool())底层所使用的阻塞队列,分析它的目的主

  • 前言 本文的主要详细分析ArrayBlockingQueue的实现原理,由于该并发集合其底层是使用了java.util.ReentrantLock和java.util.Condition来完成并发控制的,我们可以通过JDK的源代码更好的学习这些并发控制类的使用,同时该类也是所有并发集合中最简单的一个,分析该类的源码也是为之后分析其他并发集合做好基础。 一、Queue接口和BlockingQueue