據我所知,synchronized關鍵字會將本地線程緩存與主內存同步。 volatile關鍵字基本上總是在每次訪問時從主內存中讀取變量。當然,訪問主內存比本地線程緩存昂貴得多,所以這些操作很昂貴。但是,CAS操作使用低級硬件操作,但仍需訪問主內存。那麼CAS操作如何更快?爲什麼CAS(原子)操作比同步或易變操作更快
2
A
回答
1
我相信關鍵因素是您說的 - CAS機制使用底層硬件指令,允許最少的緩存刷新和爭用解決。
其他兩種機制(synchronization
和volatile
)使用不同的體系結構技巧,這些技巧在所有不同的體系結構中更普遍可用。
CAS指令在大多數現代體系結構中都可以以某種形式提供,但每種體系結構中都會有不同的實現。從Brian Goetz(據說)
有趣的報價
操作的相對速度在很大程度上是一個不是問題的問題。與鎖定和非阻塞算法之間的可伸縮性有什麼不同。如果你在1或2核心系統上運行,不要再考慮這樣的事情。
非阻塞算法通常縮放比較好,因爲它們比基於鎖的算法具有更短的「關鍵部分」。
1
請注意,CAS不一定要訪問內存。
大多數現代體系結構都實現了像MESI這樣的緩存一致性協議,如果只有一個線程同時訪問數據,它允許CPU執行快捷操作。在這種情況下,與傳統的非同步內存訪問相比,開銷非常低。
但是,當對同一個值進行大量併發更改時,緩存確實非常無用,所有操作都需要直接訪問主內存。在這種情況下,同步不同CPU高速緩存和內存訪問序列化的開銷會導致顯着的性能下降(這也稱爲高速緩存乒乓),這可能與您遇到的情況一樣糟糕甚至更糟基於鎖定的方法。
因此,不要簡單地假設,如果你切換到原子,所有你的問題消失。原子的最大優勢是無鎖(有人總是進步)或無等待(每個人在完成一定步驟後完成)的進度保證。但是,這通常與原始性能正交:等待解決方案可能比基於鎖定的解決方案慢得多,但在某些情況下,您願意接受該解決方案以獲得進度保證。
相關問題
- 1. 什麼操作都是原子操作
- 2. 爲什麼原子操作使用單獨的線程更快?
- 3. 爲什麼要在同步操作中使用異步操作?
- 4. 原子操作和原子交易
- 5. Java在原子操作上同步
- 6. 在CAS操作
- 7. 爲什麼額外的異步操作使得我的代碼比根本沒有發生操作時更快?
- 8. 爲什麼在異步操作完成之前不會執行同步操作?
- 9. 爲什麼不把tomcat停止強制作爲同步操作
- 10. File.Move原子操作
- 11. 非原子操作
- 12. DerbyJS原子操作
- 13. 原子操作 - C
- 14. NumPy函數的元素操作比操作符更快嗎?
- 15. 批量數組操作比順序操作更快嗎?
- 16. 交易操作同時與非交易操作混合
- 17. 是一個比較原子操作嗎?
- 18. jQuery同步操作
- 19. Javascript函數比普通操作更快
- 20. 同步GM_xmlhttpRequest異步操作?
- 21. 比較和交換作爲非原子操作
- 22. 什麼是更快的操作,re.match/search或str.find?
- 23. 爲什麼C++ 11 CAS操作需要兩個指針參數?
- 24. Memcached - GET和SET操作是否爲原子操作?
- 25. 爲什麼std :: shared_ptr使用原子CPU操作
- 26. 更新嵌套選擇原子操作?
- 27. 如何在node.js中的一個步驟中執行兩個異步操作作爲一個原子操作?
- 28. 設置變量作爲操作存儲操作或值嗎?
- 29. 異步操作中的異步操作
- 30. memory_order_seq_cst如何與非原子操作同步?
這完全不是這些關鍵字中的任何一個。 (特別是'同步的') – SLaks
什麼是Java中的CAS,以及它與java中的多線程有什麼關係? – UDPLover
@Meraman:http://en.wikipedia.org/wiki/Compare-and-swap – SLaks