Java 锁之 CAS
什么是CAS(compare and swap)?
CAS(Compare & Set,或是 Compare & Swap),即比較并交換,也是實現我們平時所說的自旋鎖或樂觀鎖的核心操作。
它的實現很簡單,就是用一個預期的值和內存值進行比較,如果兩個值相等,就用預期的值替換內存值,并返回 true。否則,返回 false。
- CAS是線程并發算法時用到的一種技術
- CAS是原子操作,保證并發安全,而不是保證并發同步
- CAS是CPU的一個指令
- CAS是非阻塞的、輕量級的樂觀鎖
CAS的原子性是由CPU硬件指令實現保證的,即使用JNI調用native方法調用由C++編寫的硬件級別指令,jdk中提供了Unsafe類執行這些操作。
為什么說CAS是樂觀鎖?
樂觀鎖,嚴格來說并不是鎖,通過原子性來保證數據的同步,比如說數據庫的樂觀鎖,通過版本控制來實現等,所以CAS不會保證線程同步。樂觀的認為在數據更新期間沒有其他線程影響
CAS原理
CAS就是將內存值更新為需要的值,但是有個條件,內存值必須與期望值相同。舉個例子,期望值 E、內存值M、更新值U,當E == M的時候將M更新為U。
CAS應用
由于CAS是CPU指令,我們只能通過JNI與操作系統交互,關于CAS的方法都在sun.misc包下Unsafe的類里 java.util.concurrent.atomic包下的原子類等通過CAS來實現原子操作。
CAS優缺點
優點
非阻塞的輕量級的樂觀鎖,通過CPU指令實現,在資源競爭不激烈的情況下性能高,相比synchronized重量鎖,synchronized會進行比較復雜的加鎖,解鎖和喚醒操作。
缺點
CAS總結
CAS不僅是樂觀鎖,是種思想,我們也可以在日常項目中通過類似CAS的操作保證數據安全,但并不是所有場合都適合,
曾看過帖子說,能用synchronized就不要用CAS,除非遇到性能瓶頸,因為CAS會讓代碼可讀性變差,這句話看大家怎么理解了。
拓展:
https://www.cnblogs.com/Mainz/p/3546347.html
總結
以上是生活随笔為你收集整理的Java 锁之 CAS的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 网络设计概述
- 下一篇: Java偏向锁、轻量级锁、重量级锁