Java併發編程-原子性操做

所謂原子性操做,指執行一系列操做時,這些操做要麼所有執行,要麼所有不執行,不存在只執行其中一部分的狀況。
計數器狀況:通常在設計計數器的時候都是先讀取當前值,而後 +1,最後更新。真個過程是讀-改-寫的過程,若是不能保證該過程的原子性,那麼就會出現線程安全問題。以下代碼就不能保證 ++a 是原子性操做。java

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 操做。併發

相關文章
相關標籤/搜索