cas(compare and swap),即比較並交換,也是實現我們平時所說的自旋鎖或樂觀鎖的核心操作。它的實現很簡單,就是用乙個預期的值和記憶體值進行比較,如果兩個值相等,就用預期的值替換記憶體值,並返回 true。否則,返回 false。
任何技術的出現都是為了解決某些特定的問題, cas 要解決的問題就是保證原子操作。原子操作是什麼,原子就是最小不可拆分的,原子操作就是最小不可拆分的操作,也就是說操作一旦開始,就不能被打斷,直到操作完成。在多執行緒環境下,原子操作是保證執行緒安全的重要手段。舉個例子來說,假設有兩個執行緒在工作,都想對某個值做修改,就拿自增操作來說吧,要對乙個整數 i 進行自增操作,需要基本的三個步驟:
1、讀取 i 的當前值;
2、對 i 值進行加 1 操作;
3、將 i 值寫回記憶體;
假設兩個程序都讀取了 i 的當前值,假設是 0,這時候 a 執行緒對 i 加 1 了,b 執行緒也 加 1,最後 i 的是 1 ,而不是 2。這就是因為自增操作不是原子操作,分成的這三個步驟可以被干擾。如下面這個例子,10個執行緒,每個執行緒都執行 10000 次 i++ 操作,我們期望的值是 100,000,但是很遺憾,結果總是小於 100,000 的。
Synchronized鎖的是什麼?
併發程式設計中不可避免的會出現多個執行緒共享同乙個資源的情況,為了防止出現資料不一致情況的發生,人們引入了臨界區的概念。臨界區是乙個用來訪問共享資源的 塊,同一時間內只執行乙個執行緒進入。那麼如何實現這個臨界區呢?這就用到我們的鎖了,當程序想要訪問乙個臨界區時,它先會去看看是否已經有其他執行緒進入了...
CAS無鎖演算法
cas即compare and swap.cas的語義 我認為v的值應該為a,如果是,那麼將v的值改為b,否則不修改並告訴v的值實際為多少 記憶體值v,舊的預期值a,要修改的值b 是一種解決鎖機制帶來的問題方案.例如有個int i 5,兩個執行緒都將對i進行 i 操作 如圖中紅色和綠色兩個執行緒 當...
CAS 樂觀鎖策略
cas,即compare and swap,比較後再交換,使用的場景 執行緒1執行如下指令 read a a write a 執行緒2執行如下指令 read a a write a 此時有這樣的執行順序 此時如果a的初始值為0,那麼兩個執行緒執行完最後的結果為1,而不是2。如下 public fin...