阅读Java的ConcurrentLinkedQueue文档,我想知道为什么这个实现不可能存储大小:
请注意,与大多数集合不同,size方法不是一个常量时间操作。由于这些队列的异步性质,确定当前元素数量需要遍历元素。
在源代码中,“异步性质”在哪里?我只看到一个while循环,重试入队,直到AtomicReferences匹配预期的值/引用。成功将一个值提供给队列后,为什么不能增加size:AtomicInteger
?
非常感谢。
阅读Java的ConcurrentLinkedQueue文档,我想知道为什么这个实现不可能存储大小:
请注意,与大多数集合不同,size方法不是一个常量时间操作。由于这些队列的异步性质,确定当前元素数量需要遍历元素。
在源代码中,“异步性质”在哪里?我只看到一个while循环,重试入队,直到AtomicReferences匹配预期的值/引用。成功将一个值提供给队列后,为什么不能增加size:AtomicInteger
?
非常感谢。
ConcurrentLinkedQueue
的一个重要性能优势在于,当您更新头部时,不必担心尾部,反之亦然,对吧?AtomicInteger
,您仍然可能会出现CAS操作失败的情况,因为现在您有一个“热点”,每次进行poll/offer操作时都要更新它。