Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 并发集合大小计算_Java_Multithreading_Collections_Concurrency - Fatal编程技术网

Java 并发集合大小计算

Java 并发集合大小计算,java,multithreading,collections,concurrency,Java,Multithreading,Collections,Concurrency,Java标准库中大多数集合的文档,如和,都附带以下免责声明: 请注意,与大多数集合不同,size方法不是 恒定时间操作。因为它们的异步特性 设置,确定当前元素数需要遍历 如果出现这种情况,可能会报告不准确的结果 在遍历过程中修改集合 这是什么意思?为什么他们不能保留一个计数器(比如an)并在调用size()时返回值呢 是因为计数器必须同步,因此会产生阻塞点吗 作为旁注,似乎没有这个问题。为什么呢?查看源代码,它似乎使用了保存在数组中的多个计数器,这些计数器在调用size()时求和。这是为了避开瓶

Java标准库中大多数集合的文档,如和,都附带以下免责声明:

请注意,与大多数集合不同,size方法不是 恒定时间操作。因为它们的异步特性 设置,确定当前元素数需要遍历 如果出现这种情况,可能会报告不准确的结果 在遍历过程中修改集合

这是什么意思?为什么他们不能保留一个计数器(比如an)并在调用
size()
时返回值呢

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


作为旁注,似乎没有这个问题。为什么呢?查看源代码,它似乎使用了保存在数组中的多个计数器,这些计数器在调用
size()
时求和。这是为了避开瓶颈还是有其他原因?

使用共享资源来维护size()既昂贵又毫无用处
size()
一旦返回,它可能就不正确,因为您无法锁定集合,因此它可以在您调用集合和获取值之间进行更改


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

原子计数器肯定是坏的。当然,
size()
不能完全信任,我接受这一点。但我的问题是遍历集合中的每个元素以计算它们的非常量成本。“但我想我当时在瓶颈问题上是对的?”古斯塔夫卡尔森·彼得的第一句话确实说明了原因。同步和缓存失效对于队列的运行来说代价非常高昂。是的,你是对的,那里肯定会有瓶颈。这是
ReentrantReadWriteLock