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