日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

对 cas 操作的理解

發布時間:2023/12/19 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 对 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操作最根本的是針對并發,很多內核或者線程已經同時獲取到目標值,接著就是執行操作,然后寫回內存。在寫回去,又會再一次獲取目標值,比對之前記錄的目標值是不是一樣,一樣就基于目標值操作。否則更新目標值,直到目標值比對結果一樣,那么就基于最新的目標值操作(不斷嘗試,最終肯定操作成功)。
可見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 操作的理解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。