簡體   English   中英

ConcurrentLinkedQueue的大小

[英]size of ConcurrentLinkedQueue

閱讀Java的ConcurrentLinkedQueue Docs ,我想知道為什么實現不可能存儲大小:

請注意,與大多數集合不同,size方法不是恆定時間操作。 由於這些隊列的異步性質,確定當前元素數量需要遍歷元素。

源頭中的這種“異步性”是什么? 我只看到一個while循環來重試排隊,直到AtomicReferences匹配預期的值/引用。 為什么在成功向隊列提供值后無法增加size:AtomicInteger

非常感謝。

想象一下,你有兩個線程,一個添加一個新項目,另一個刪除一個項目。 一開始隊列中沒有項目。

假設第一個線程添加項目,緊接着另一個線程刪除項目並遞減大小,此時大小為-1,然后第一個線程將大小增加到0。

一個有點人為的例子,但你需要使整個操作成為原子,以確保沒有其他線程可以訪問-1的大小。

ConcurrentLinkedQueue一個重要性能優勢來自於您在更新磁頭時不必擔心尾部,反之亦然,對吧?

這意味着基本上2個線程可以同時輪詢/提供而不會產生干擾(如果隊列大小不是0,那就是)。

如果你有一個櫃台,情況並非如此。 即使它是具有良好並發性的AtomicInteger ,您仍然會增加CAS操作失敗的可能性,因為現在您有這個“熱點”,您每次進行輪詢/提供時都會更新。

當作者說“異步性質”時,並不完全確定作者是否意味着這一點,但我認為這是他們沒有像你建議的那樣的計數器的最大原因。

為什么在成功向隊列提供值后無法增加大小:AtomicInteger?

可能是因為在不對方法的並發性產生負面影響的情況下,不能以原子方式完成提供/減少。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM