CAS(Compare and Swap)算法:java
1)原理: 1)CAS有3個操做數,內存值V,預期值(舊值)A,要寫入的新值B。 2)當且僅當 預期值A=內存值V 時,將內存值V修改成新值B,不然什麼都不作。 3)CAS能夠看做是一種樂觀鎖。 2)應用:用於管理對共享數據的併發訪問。 3)CAS存在的問題: 1)ABA問題:若是一個變量的值原來是A,而後變成了B,最後又變成了A,那麼使用CAS進行檢查時會發現它的值沒有發生變化,但實際上卻變化了。 解決方法:使用版本號。 2)循環時間長,開銷大 3)只能保證一個共享變量的原子操做 說明:對一個共享變量進行操做時,能夠使用循環CAS的方式來保證原子性,可是對多個共享變量進行操做時,循環CAS就沒法保證操做的原子性了。 解決方法: 1>使用鎖。 2>把多個共享變量合併成一個共享變量來操做,即將多個共享變量封裝到一個對象中,而後使用循環CAS對這個對象進行操做。 eg:JDK提供了 java.util.concurrent.atomic.AtomicReference類 來保證引用對象之間的原子性。 4)java中原子操做的實現: 1)使用鎖 2)循環CAS 說明:除了偏向鎖,JVM實現鎖的方式都用了循環CAS,即:當一個線程想進入同步塊的時候使用循環CAS的方式來獲取鎖,當它退出同步塊的時候使用循環CAS來釋放鎖。