【发布时间】:2015-07-31 19:04:00
【问题描述】:
ConcurrentLinkedQueue、ConcurrentLinkedDequeue 和 ConcurrentSkipListSet 等 Java 标准库中的大多数集合的文档都附带以下免责声明:
请注意,与大多数集合不同,size 方法不是 恒定时间操作。由于这些的异步性质 集合,确定当前元素个数需要遍历 的元素,因此可能会报告不准确的结果,如果这 集合在遍历过程中被修改。
这是什么意思?为什么他们不能保留一个计数器(例如,AtomicInteger)并在调用 size() 时返回值?
是不是因为计数器必须同步,因此造成了阻塞点?
附带说明,ConcurrentHashMap 似乎没有这个问题。这是为什么?查看源代码,它似乎使用了多个计数器,这些计数器保存在一个数组中,这些计数器在对size() 的调用中求和。是为了绕过瓶颈还是有其他原因?
【问题讨论】:
-
原子计数器肯定不好。
标签: java multithreading collections concurrency