CAS
872
2025-04-03
樂觀鎖與悲觀鎖的概念
鎖可以從不同的角度分類。其中,樂觀鎖和悲觀鎖是一種分類方式。
悲觀鎖:
悲觀鎖就是我們常說的鎖。對于悲觀鎖來說,它總是認為每次訪問共享資源時會發生沖突,所以必須對每次數據操作加上鎖,以保證臨界區的程序同一時間只能有一個線程在執行。
樂觀鎖:
樂觀鎖又稱為“無鎖”,顧名思義,它是樂觀派。樂觀鎖總是假設對共享資源的訪問沒有沖突,線程可以不停地執行,無需加鎖也無需等待。而一旦多個線程發生沖突,樂觀鎖通常是使用一種稱為CAS的技術來保證線程執行的安全性。
由于無鎖操作中沒有鎖的存在,因此不可能出現死鎖的情況,也就是說樂觀鎖天生免疫死鎖。
樂觀鎖多用于“讀多寫少“的環境,避免頻繁加鎖影響性能;而悲觀鎖多用于”寫多讀少“的環境,避免頻繁失敗和重試影響性能。
CAS的概念
CAS的全稱是:比較并交換(Compare And Swap)。在CAS中,有這樣三個值:
V:要更新的變量(var)
E:預期值(expected)
N:新值(new)
比較并交換的過程如下:
判斷V是否等于E,如果等于,將V的值設置為N;如果不等,說明已經有其它線程更新了V,則當前線程放棄更新,什么都不做。
所以這里的預期值E本質上指的是“舊值”。
我們以一個簡單的例子來解釋這個過程:
如果有一個多個線程共享的變量i原本等于5,我現在在線程A中,想把它設置為新的值6;
我們使用CAS來做這個事情;
首先我們用i去與5對比,發現它等于5,說明沒有被其它線程改過,那我就把它設置為新的值6,此次CAS成功,i的值被設置成了6;
如果不等于5,說明i被其它線程改過了(比如現在i的值為2),那么我就什么也不做,此次CAS失敗,i的值仍然為2。
在這個例子中,i就是V,5就是E,6就是N。
那有沒有可能我在判斷了i為5之后,正準備更新它的新值的時候,被其它線程更改了i的值呢?
不會的。因為CAS是一種原子操作,它是一種系統原語,是一條CPU的原子指令,從CPU層面保證它的原子性
當多個線程同時使用CAS操作一個變量時,只有一個會勝出,并成功更新,其余均會失敗,但失敗的線程并不會被掛起,僅是被告知失敗,并且允許再次嘗試,當然也允許失敗的線程放棄操作。
任務調度
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。