对 cas 操作的理解
生活随笔
收集整理的這篇文章主要介紹了
对 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,否則什么都不做。
cas 是操作系統指令,目前絕大多數處理器使用這個指令架構。
cas 是通過鎖cpu 的核的高速緩存或者地址總線(鎖地址總線是針對多cpu的分布式系統)實現的。cas 是一套指令。
通過一個cas操作執行一個指令,首先,這一套指令的第一條是要獲取目標值放入在對應的緩存中。
cas操作最根本的是針對并發,很多內核或者線程已經同時獲取到目標值,接著就是執行操作,然后寫回內存。在寫回去,又會再一次獲取目標值,比對之前記錄的目標值是不是一樣,一樣就基于目標值操作。否則更新目標值,直到目標值比對結果一樣,那么就基于最新的目標值操作(不斷嘗試,最終肯定操作成功)。
可見cas 其二的關鍵因子:跟近目標值,將其他線程的同步操作進行更新,然后操作。
cas 本質上也有鎖,因為某一cpu或者線程正在操作值,恰恰另外的cpu也要進行操作,但是需要先獲取目標值那么此時是不能獲取目標值的,因為,cas對應的保護地址在操作中,其他cpu一旦又操作,地址將被鎖住,或者緩存將被鎖住。cas有對應的地址被記錄而加鎖保護,這種鎖基于硬件的。
cas是硬件指令,c層代碼可以調用,java層無法直接調用。
使用java 模擬cas操作:
public class CASCount implements Runnable {private SimilatedCAS counter = new SimilatedCAS(); @Overridepublic 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失敗,就去拿新值繼續執行CASoldValue = 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; } }總結
以上是生活随笔為你收集整理的对 cas 操作的理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 大彻大悟是什么歌的歌词 什么歌有大彻大悟
- 下一篇: 请求 返回 net::ERR_CONTE