并发收集大小计算

Gus*_*son 5 java collections concurrency multithreading

Java标准库中的大多数集合的文档(例如ConcurrentLinkedQueue,ConcurrentLinkedDequeueConcurrentSkipListSet)附带以下免责声明:

请注意,与大多数集合不同,size方法不是常量操作.由于这些集合的异步性质,确定当前元素数量需要遍历元素,因此如果在遍历期间修改此集合,则可能会报告不准确的结果.

那是什么意思?为什么他们不能保留一个计数器(例如,一个AtomicInteger)并只返回调用的值size()

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

另外,ConcurrentHashMap似乎没有这个问题.这是为什么?查看源代码,似乎它使用保存在数组中的多个计数器,这些计数器在调用时求和size().这是为了规避阻塞点还是有另一个原因?

Pet*_*rey 5

使用共享资源来维护size()既昂贵又无用. size()它一旦返回就可能不正确,因为你无法锁定集合,所以它可以在你调用它和获得值之间发生变化.

ConcurentHashMap具有相同的方法.方法返回之前size()可能不正确.