多執行緒原子性 CAS以及ABA問題

2021-10-21 14:55:47 字數 668 閱讀 9850

通常情況下為了保證安全,在乙個執行緒對乙個數值訪問時要上鎖,但是為了保證效率,cas中是不上鎖的。

列如:

現在有乙個值為0,讀取這個值,並且將其存在e中,則:e=0。然後對e進行遞增運算,有計算結果設為v。e++後,設乙個新的值為n(即:n=e++),這時去檢視e,如果e還是為0,則表明沒有其他的執行緒修改e,這時就將e更新為新值v。如果e!=0,則表明有其他執行緒修改了e。這時讓e等於被其他執行緒修改之後的值,再按照先前的步驟進行一遍,即:當前e=e'=2(假設e被其他執行緒修改為了2),e進行遞增,e++,有計算結果值v,v=3,再看e是否還是2,如果e=2則說明沒有其他執行緒修改e,這時修改e為新值v,e=3;

這時就會有小夥伴產生疑惑了,如果在e運算得到新值n後,檢視e的值發現e沒有變化(原先e=0,現在e也=0),然後在你準備將v賦給e的這段時間內,有執行緒對e的值進行了更改,然後又有執行緒將e的值修改回了原來的值(e=0,執行緒1將e修改為3,執行緒2將e又修改回了0),這時候我們看到的那個e其實已經不是原來的e了。(就好比你的女朋友和你分手了,在你們分手期間她找了別的男朋友,然後他們分手了,你們又和好,這時候你的女朋友已經不是原來的那個女朋友了!!!!)

所以這裡就引出了aba問題:

CAS如何實現原子性與ABA問題

cas 全稱是 compare and swap 比較並且交換 是一種用於在多執行緒環境下實現同步功能的機制,其也是無鎖優化,或者叫自旋,還有自適應自旋 說法不算準確,底層還是存在鎖,後面會講 以atomicinteger類的compareandset方法舉例。其原始碼 expect與舊值一致,則用...

多執行緒 x y的原子性

所謂的原子性是指該操作不能再繼續劃分為更小的操作,在多執行緒中原子操作是乙個很重要的概念,決定了該操作是否需要同步機制來進行保護。在x86中,x y包含兩個操作 讀取y至暫存器,然後將該值寫入x,其中讀取y的值至暫存器中是原子的,將值寫入x也是原子的,但是這裡需要格外注意的是兩個原子操作的組合不一定...

多執行緒學習一 可見性 原子性和有序性

在單核時代,所有的快取都操作同乙個cup上的快取,所以可見性很容易解決。當a執行緒更新了快取上的變數,那麼在b執行緒去訪問該變數的時候,拿到的一定是最新值。在多核時代,每個cup都有自己的快取區,當不同cup上的執行緒去訪問記憶體中的同個變數時,假設該變數在cup中都有快取。那麼不同cup上的執行緒...