1. 程式人生 > 其它 >Compare And Swap

Compare And Swap

Compare And Swap 就是經常聽到的 CAS(比較和交換),它就是將多個原子操作(讀-改-寫)合併成一個原子操作。

舉個例子:i++ 這個自增操作,它可以被拆分成三個操作,讀 i 的值、i 的值加 1、寫 i 的值;而 CAS 就可以將這三個原子操作,合併成一個原子操作。

比較和交換:先說一下比較,當寫新資料到記憶體的時候,會先使用舊資料和當前記憶體中的值進行比較,如果一致就會將新值寫入記憶體,不一致就不會寫入。

值得注意的是:CAS 必須配合 volatile 使用。

下面是 Java 自帶的一些支援原子操作的類:

  • 1
  • 1
  • 1

值得注意的是:其實 CAS 的底層是 lock cmpxchg 指令(X86 架構),在單核 CPU 和多核 CPU 下都能夠保證【比較-交換】的原子性。
在多核狀態下,某個核執行到帶 lock 的指令時,CPU 會讓匯流排鎖住,當這個核把此指令執行完畢,再開啟匯流排。這個過程中不會被執行緒的排程機制所打斷,保證了多個執行緒對記憶體操作的準確性,是原子的。

鎖是有一定開銷的,而 CAS 是通過 CPU 實現的,效能損耗少。

討論

  1. 兩個執行緒同時對同一個共享變數執行CAS操作,另一個執行緒會等待嗎?