在瞭解算法之前,我們先對回顧基本概念:
原子性:具有不可分割性。比如 a=0;(a非long和double類型) 這個操作是不可分割的,那麼我們說這個操作時原子操作。再比如:a++; 這個操作實際是a = a + 1;是可分割的,所以他不是一個原子操作。非原子操作都會存在線程安全問題。
volatile 關鍵字:當多個線程進行操作共享數據時,可以保證內存中的數據可見,使得對臨界區資源的修改可以馬上被其他線程看到,它是通過添加內存屏障實現的。(底層調用JVM的內存柵欄,對數據實時向主存中進行更新)
CAS:Compare and Swap,是比較並交換的意思。是一種非阻塞算法 (nonblocking algorithms)
CAS有3個操作數,內存值V,預期值A,要修改的新值B。當且僅當預期值A和內存值V相同時,將內存值V修改爲B,否則什麼都不做。
模擬CAS算法實現
/**
* 模擬CAS算法 本案例中 synchronized所修飾方法 JVM底層通過硬件實現,本案例僅模擬
*
* @author xiaoqiang
* @Time 2017-7-4
*/
public class CompareAndSwap {
private int value;
/**
* 獲取當前內存值
*
* @return
*/
public synchronized int get() {
return value;
}
/**
* 若不成功可繼續操作直到成功
*
* @param expectedValue
* 預期值
* @param newValue
* 新值
* @return 是否成功
*/
public synchronized boolean compareAndSwap(int expectedValue, int newValue) {
int oldValue = value;
if (oldValue == expectedValue) {
this.value = newValue;
}
return oldValue == expectedValue;
}
public static void main(String[] args) {
CompareAndSwap cas = new CompareAndSwap();
for (int i = 0; i < 20; i++) {
new Thread(() -> {
// Lambda表達式書寫代碼 (JDK1.8新特性)
int value = cas.get();
System.out.println(cas.compareAndSwap(value, (int) (Math.random() * 100)));
}).start();
}
}
}
JAVA 8 Lambda表達式使用-> click me
CAS算法詳解 ->大家可以看看兩位大神寫的