2013-10-27 33 views
2

據我所知,synchronized關鍵字會將本地線程緩存與主內存同步。 volatile關鍵字基本上總是在每次訪問時從主內存中讀取變量。當然,訪問主內存比本地線程緩存昂貴得多,所以這些操作很昂貴。但是,CAS操作使用低級硬件操作,但仍需訪問主內存。那麼CAS操作如何更快?爲什麼CAS(原子)操作比同步或易變操作更快

+1

這完全不是這些關鍵字中的任何一個。 (特別是'同步的') – SLaks

+0

什麼是Java中的CAS,以及它與java中的多線程有什麼關係? – UDPLover

+0

@Meraman:http://en.wikipedia.org/wiki/Compare-and-swap – SLaks

回答

1

我相信關鍵因素是您說的 - CAS機制使用底層硬件指令,允許最少的緩存刷新和爭用解決。

其他兩種機制(synchronizationvolatile)使用不同的體系結構技巧,這些技巧在所有不同的體系結構中更普遍可用。

CAS指令在大多數現代體系結構中都可以以某種形式提供,但每種體系結構中都會有不同的實現。從Brian Goetz(據說)

有趣的報價

操作的相對速度在很大程度上是一個不是問題的問題。與鎖定和非阻塞算法之間的可伸縮性有什麼不同。如果你在1或2核心系統上運行,不要再考慮這樣的事情。

非阻塞算法通常縮放比較好,因爲它們比基於鎖的算法具有更短的「關鍵部分」。

1

請注意,CAS不一定要訪問內存。

大多數現代體系結構都實現了像MESI這樣的緩存一致性協議,如果只有一個線程同時訪問數據,它允許CPU執行快捷操作。在這種情況下,與傳統的非同步內存訪問相比,開銷非常低。

但是,當對同一個值進行大量併發更改時,緩存確實非常無用,所有操作都需要直接訪問主內存。在這種情況下,同步不同CPU高速緩存和內存訪問序列化的開銷會導致顯着的性能下降(這也稱爲高速緩存乒乓),這可能與您遇到的情況一樣糟糕甚至更糟基於鎖定的方法。

因此,不要簡單地假設,如果你切換到原子,所有你的問題消失。原子的最大優勢是無鎖(有人總是進步)或無等待(每個人在完成一定步驟後完成)的進度保證。但是,這通常與原始性能正交:等待解決方案可能比基於鎖定的解決方案慢得多,但在某些情況下,您願意接受該解決方案以獲得進度保證。