CAS操作


CAS操作:

Compare and Swap,比較並操作,CPU指令,在大多數處理器架構,包括IA32、Space中采用的都是CAS指令,CAS的語義是“我認為V的值應該為A,如果是,那么將V的值更新為B,否則不修改並告訴V的值實際為多少”,CAS是項樂觀鎖技術,當多個線程嘗試使用CAS同時更新同一個變量時,只有其中一個線程能更新變量的值,而其它線程都失敗,失敗的線程並不會被掛起,而是被告知這次競爭中失敗,並可以再次嘗試。CAS有3個操作數,內存值V,舊的預期值A,要修改的新值B。當且僅當預期值A和內存值V相同時,將內存值V修改為B,否則什么都不做。

 

悲觀鎖和樂觀鎖

獨占鎖是一種悲觀鎖,synchronized就是一種獨占鎖,它假設最壞的情況,並且只有在確保其它線程不會造成干擾的情況下執行,會導致其它所有需要鎖的線程掛起,等待持有鎖的線程釋放鎖。而另一個更加有效的鎖就是樂觀鎖。所謂樂觀鎖就是,每次不加鎖而是假設沒有沖突而去完成某項操作,如果因為沖突失敗就重試,直到成功為止。

 

簡單來講就是,當我所認為的A與實際上內存的V相同的時候,就把新的值B給V,否則就失敗重來。

 

這里粘貼一個,模擬CAS實現的計數器:

public class CASCount implements Runnable {
    
    private SimilatedCAS counter = new SimilatedCAS();  

    @Override
    public void run() {
         for (int i = 0; i < 10000; i++) {  
                System.out.println(this.increment());  
         }  
    }
    
    public int increment() {
        int oldValue = counter.getValue();
        int newValue = oldValue + 1;
        
        while (!counter.compareAndSwap(oldValue, newValue)) { //如果CAS失敗,就去拿新值繼續執行CAS
              oldValue = counter.getValue();  
              newValue = oldValue + 1;  
        }
        
        return newValue;
    }
    
    public static void main(String[] args) {  
        Runnable run = new CASCount();  
  
        new Thread(run).start();  
        new Thread(run).start();  
        new Thread(run).start();  
        new Thread(run).start();  
        new Thread(run).start();  
        new Thread(run).start();  
        new Thread(run).start();  
        new Thread(run).start();  
        new Thread(run).start();  
        new Thread(run).start();  
    }  
}
class SimilatedCAS {
    private int value;
    
    public int getValue() {
        return value;
    }
    
    // 這里只能用synchronized了,畢竟無法調用操作系統的CAS  
    public synchronized boolean compareAndSwap(int expectedValue, int newValue) {  
        if (value == expectedValue) {  
            value = newValue;  
            return true;  
        }  
        return false;  
    }  
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM