實戰Java高併發程序設計-07原子操作

悲觀與樂觀

對於併發而言,鎖是一種悲觀策略。總是假設每一次臨界區操作都會產生衝突,因此,必須每次操作都小心翼翼。如果有多個線程訪問臨界區資源,就犧牲性能讓線程進行等待,使得線程阻塞。而無鎖是一種樂觀的策略,它會假設對資源的訪問時沒有衝突的,不需要等待,所有線程都可用不停頓的執行。那麼在遇到衝突的情況下采用一種叫做比較交換技術(CAS Compare And Swap)來鑑別線程衝突,一旦檢查到衝突產生,就重試當前操作,直到沒有衝突爲止.

Cas算法

cas算法 示例:
在cas算法中包含三個參數 V,E,N 。 V表示要更新的變量,E表示預期值,N表示新值。僅當V等於E時,纔會將V設置爲N,如果V不等於E,說明其他線程做了更新,則當前線程什麼都不做。最後cas返回當前V的真實值。CAS操作是抱着樂觀的態度進行的,它總是認爲自己的操作可以成功。當多個線程同時操作一個變量時,只會有一個會操作成功,其他的都會失敗。
而原子操作則是在cas的基礎上,寫入一個while(true) 在循環中,操作成功的線程就會跳出,而失敗的線程在循環裏面繼續執行,直到成功操作爲止。

原子整數(AtomicInteger)

import java.util.Random;
import java.util.concurrent.atomic.AtomicInteger;

public class M {

    private static AtomicInteger count = new AtomicInteger();

    private static int c = 0;

    static class T implements Runnable{

        @Override
        public void run() {
            for(int i = 0 ; i < 100 ; i++){
                try {
                    Thread.sleep(new Random().nextInt(100));
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                count.addAndGet(1);
                c++;
            }
        }

    }

    public static void main(String[] args) {

        for(int i = 0 ; i < 5 ; i++){
            new Thread(new T()).start();
        }

        while(true){
            System.out.println(count.get());
            System.out.println("c : " + c);
        }
    }

}

輸出結果 count 會非常穩定 最終等於 500 而 c 不穩定小於等於500

與AtomicInteger類似的還有AtomicLong,AtomicBoolean分別表示long,boolean類型.

原子的對象引用(AtomicReference)

AtomicReference與AtomicInteger非常類似,不同之處在於AtomicInteger是對於整數的封裝,而AtomicReference是對於普通對象的引用,也就是說它可以保證在修改對象的引用時線程的安全性。

帶時間梭的原子對象引用(AtomicStampedReference)

線程判斷對象是否可以正取寫入的條件時對象的當前值和期望值是否一致,一般情況下下都是沒有問題的。但是存在特殊情況,比如:這個對象的值被其他線程改變了之後,又改了回去。進行了兩次修改恢復到了舊的數值,這樣的話當前線程是無法判斷是否被更改過.而AtomicStampedReference可以解決這個問題.

數組也能無鎖(AtomicIntegerArray)

除了基本數據類型之外,JDK還提供了數組等結構,AtomicIntegerArray,AtomicLongArray,AtomicReferenceArray。分別表示整數原子數組,長整型原子數組,對象原子數組。

普通變量也能原子操作

AtomicIntegerFieldUpdater
AtomicLongFieldUpdater
AtomicReferenceFieldUpdater

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章