1. 程式人生 > >Java併發程式設計-原子性操作

Java併發程式設計-原子性操作

所謂原子性操作,指執行一系列操作時,這些操作要麼全部執行,要麼全部不執行,不存在只執行其中一部分的情況。
計數器情況:一般在設計計數器的時候都是先讀取當前值,然後 +1,最後更新。真個過程是讀-改-寫的過程,如果不能保證該過程的原子性,那麼就會出現執行緒安全問題。如下程式碼就不能保證 ++a 是原子性操作。

public class ThreadNotSafeCount {

    private int a;

    public int getA() {
        return a;
    }

    public void increase() {
        ++ a;
    }
}

如何保證多個操作的原子性?最簡單方法是使用 synchronized 關鍵字進行同步,程式碼如下:

public class ThreadNotSafeCount {

    private int a;

    public synchronized int getA() {
        return a;
    }

    public synchronized void increase() {
        ++ a;
    }
}

分析:使用 synchronized 關鍵字可以實現執行緒安全性,即記憶體可見性和原子性。但 synchronized 是獨佔鎖,即沒有獲取內部鎖的執行緒會被阻塞,而這裡的 getA 方法只是讀操作,多個執行緒同時呼叫不會存線上程安全問題,加入 synchronized 關鍵字,造成同一時間只能有一個執行緒對其進行呼叫,大大降低了併發性。為了保證共享變數 a 的記憶體可見性,還得需要 synchronized 來實現記憶體可見性。這樣一來一邊降低了併發性,一方面還必須要使用保證記憶體可見性,所以需要一種方式可以不降低併發性,而且可以保證記憶體可見性。這樣的方式是存在的,這就是 CAS 操作。