BlockingQueue中的同步由Lock實現,而ConcurrentLinkedQueue使用涉及CAS的無鎖算法。但我的問題是關於上下文切換開銷。如果有10個線程將來自BlockingQueue的請求排隊,那麼每次只有一個會鎖定隊列,並且將放置9個上下文切換(9個線程將鬆動),而在ConcurrentLinkedQueue的情況下,沒有上下文切換開銷,但是儘可能時間切片關注所有10個線程會在時間片結束後一次又一次地進行上下文切換,並且與BlockingQueue相比,這不會導致更多的上下文切換開銷?哪一個導致更少的上下文切換開銷?BlockingQueue中的上下文切換開銷
3
A
回答
0
ConcurrentLinkedQueue沒有take(),所以我們不能比較。 所以你比較.poll()。 我們可以辯論爲什麼你不使用BQ.take()和BQ.put()執行signal()而不是signalAll()並且只喚醒一個線程而不是10的事實,但這是另一個問題。
BQ鎖使用可重入鎖來實現,它們本身使用CAS。
唯一的區別在於這種鎖定的「公平性」(參見再入行鎖的屬性),並且可能是併發鏈接隊列的更緊密的鎖編碼(更小的堆棧幀深度)。
微基準測試是,檢查OS`arrayBlockingQueue.poll()`的CTX開關次數,以及JVM探查熱點...
相關問題
- 1. spinlocked線程如何避免上下文切換的開銷?
- 2. 線程池是否會產生上下文切換開銷?
- 3. 虛擬內存如何增加上下文切換開銷?
- 4. 如何估計線程上下文切換開銷?
- 5. 嵌入單 - 的開銷土生土長 - >管理上下文切換
- 6. 線程上下文切換vs進程上下文切換
- 7. lpc 1769上下文切換
- 8. Python:GIL上下文切換
- 9. 切換畫布上下文
- 10. 上下文切換太貴
- 11. PHP上下文切換
- 12. 在ReverseProxy上下文中切換SSLVerifyClient
- 13. 在Linux中監視上下文切換
- 14. 在Windows中強制上下文切換
- 15. 切換OpenGL上下文或切換上下文渲染目標,而最好?
- 16. 從進程上下文切換切換線程上下文有多好?
- 17. FreeRTOS的上下文切換 - xQueueSend
- 18. Symfony:切換上下文的問題
- 19. ObjectOutput/InputStream的上下文切換
- 20. 線程之間的上下文切換
- 21. Windows驅動程序開發:上下文切換回調?
- 22. 上下文切換意味着模式切換
- 23. 將上下文切換與Xenomai
- 24. 忙等待和上下文切換
- 25. 多線程:上下文切換
- 26. 上下文切換多線程
- 27. 計算有多少上下文切換
- 28. 什麼是上下文切換?
- 29. FreeRTOS初始上下文切換
- 30. 監視pthread上下文切換
如果兩個線程調用,則可能不會有任何上下文切換。首先是因爲,除非線程除了儘可能快地輪詢隊列並拋出節點之外什麼都不做,它們可能會在互斥體中花費相對較少的時間,並且不會有太多的爭用。其次,因爲即使它們偶爾會發生碰撞,您的JVM可能也會使用複雜的混合鎖定算法,這種算法不會阻止線程的丟失,直到獲勝者花費的時間超過一小段時間來保持互斥鎖爲止。 –
但是你是對的,如果兩個或多個線程儘可能快地調用'concurrentLinkedQueue.poll()',那麼它將永遠不會阻止它們中的任何一個。 –
我的意見是,如果你遇到一個情況,你有10個線程同時等待資源的訪問,那麼你的問題不是如何處理這個爭用,而是你爲什麼有這麼多的線程擺在首位。 CAS不是萬能的,它是一種優化,只要你沒有溢出,它就一直存在。 – didierc