簡體   English   中英

ConcurrentLinkedQueue問題

[英]ConcurrentLinkedQueue Questions

您能否說明我們是否需要使用顯式同步或使用ConcurrentLinkedQueue的鎖? 我特別想知道以下ConcurrentLinkedQueue方法是否需要同步調用。

  • 明確
  • 尺寸

大小可能是唯一可能需要顯式同步的方法,因為它不是原子方法,但是ConcurrentLinkedQueue java文檔說,

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

這使我相信,雖然大小調用可能很慢,但是不需要任何顯式的同步調用。

提前致謝 ...

正如Javadoc和source所說,clear()不是原子操作(它在AbstractQueue類中實現):“此實現重復調用poll直到返回null。” poll是原子的,但是如果在clear()進行期間使用offer,則將在清除過程中添加一些內容,而clear()會將其刪除...

如果將使用clear(),則應使用LinkedBlockingQueue而不是ConcurrentLinkedQueue。

您不需要任何顯式的同步或鎖定。 docs指出,這是一個線程安全的集合。 這意味着每種方法都是正確的原子方法(盡管您指出, size()可能很慢)。

您應該也不需要在任何這些方法上使用顯式鎖定。

是的,您不需要使用顯式同步,因為這是線程安全的集合。 允許任何並發訪問而無需擔心

無需進行同步以保留隊列的內部結構。 但是,可能有必要線性化結構的其他不變量。

例如,在任何共享的可變容器中, size()都是毫無意義的。 除非您停止世界並阻止並發修改,否則它只能告訴您有關上次詢問的內容,而不是現在的內容。 它僅用於指示性監視目的, 切勿在算法中使用它。

同樣,如果沒有某種外部干預, clear()並不大。 清楚什么? 您打電話時其中的內容是否清楚? 在並發結構中,這是一個難題,即使不是不可能的問題。

因此,最好不要將其用作簡單的線程安全隊列(僅提供和輪詢),並避免使用其他線程,除非從外部進行鎖定。

暫無
暫無

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

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