[英]Java: What would happen if multiple threads are trying to access a queue implemented from LinkedList as opposed to ConcurrentLinkedQueue?
如果多個線程試圖訪問從LinkedList
實現的隊列而不是ConcurrentLinkedQueue
將會發生什么?
假設每個線程僅使用add()
和poll()
而沒有其他函數調用,那么這兩個操作是原子操作嗎?
如果它們是原子的,那么使用ConcurrentLinkedQueue
代替常規的LinkedList
實現是否有好處?
它是未定義的。 常規的LinkedList
對於多線程使用不是原子的/安全的。
您可以將其包裝在Collections.synchronizedList(LinkedList)
以獲得原子操作,但是仍然有所不同。 ConcurrentLinkedQueue
是專門為在多線程環境中使用而設計的,它是“基於鏈接節點的無邊界線程安全隊列”。 如果您閱讀類似的文檔 ,您會發現它做的一些不同的事情
實現采用高效的非阻塞算法[...]
而同步的LinkedList
鎖定每個操作的整個列表。 但它也有缺點
注意,與大多數集合不同,size方法不是恆定時間操作。
這取決於您的要求,但是如果您想要並發隊列,則可以假定您不應該使用LinkedList
,這是非常安全的。
這些操作不是原子的。 查看LinkedList的源代碼,您會看到add和poll調用例程,對於兩個線程在沒有同步的情況下在同一實例上執行絕對是最不安全的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.