java中atomic原子類的原理介紹

2021-08-22 01:14:29 字數 985 閱讀 1112

atomic原子類導圖

無鎖即無障礙的執行, 所有執行緒都可以到達臨界區, 接近於無等待.

無鎖採用cas(compare and swap)演算法來處理執行緒衝突, 其原理如下

cas包含3個引數cas(v,e,n).v表示要更新的變數, e表示預期值, n表示新值.

僅當v值等於e值時, 才會將v的值設為n, 如果v值和e值不同, 則說明已經有其他執行緒做了更新, 則當前執行緒什麼

都不做. 最後, cas返回當前v的真實值. cas操作是抱著樂觀的態度進行的, 它總是認為自己可以成功完成操作.

當多個執行緒同時使用cas操作乙個變數時, 只有乙個會勝出, 並成功更新, 其餘均會失敗.失敗的執行緒不會被掛起,

僅是被告知失敗, 並且允許再次嘗試, 當然也允許失敗的執行緒放棄操作.基於這樣的原理, cas操作即時沒有鎖,

也可以發現其他執行緒對當前執行緒的干擾, 並進行恰當的處理.

cpu指令

另外, 雖然上述步驟繁多, 實際上cas整乙個操作過程是乙個原子操作, 它是由一條cpu指令完成的,

從指令層保證操作可靠, 不會被多執行緒干擾.

無鎖與volatile

無鎖可以通過cas來保證原子性與執行緒安全, 他與volatile什麼區別呢?

當給變數加了volatile關鍵字, 表示該變數對所有執行緒可見,但不保證原子性.

以volatile i, i++為例, 分為以下四步:

其中前三步是執行緒不安全的, 可能其他執行緒會對i進行讀寫.

因此任何依賴於之前值的操作, 如i++, i = i *10使用volatile都不安全.

而諸如get/set, boolean這類可以使用volatile.

Java多執行緒 原子類

1 基本型別 類atomicboolean atomicinteger atomiclong atomicreference 各自提供對相應型別單個變數的訪問和更新。每個類也為該型別提供適當的實用工具方法。2 陣列型別 類atomicintegerarray atomiclongarray 和ato...

java原子類01 之框架

根據修改的資料型別,可以將juc包中的原子操作類可以分為4類。1.基本型別 atomicinteger,atomiclong,atomicboolean 2.陣列型別 atomicintegerarray,atomiclongarray,atomicreferencearray 3.引用型別 ato...

java併發程式設計基礎 原子類與原子更新

1 什麼是原子類 原子類可以認為其操作都是不可分割 2 為什麼要有原子類 對多執行緒訪問同乙個變數,我們需要加鎖,而鎖是比較消耗效能的,jdk1.5之後,新增的原子操作類提供了一種用法簡單 效能高效 執行緒安全地更新乙個變數的方式,這些類同樣位於juc包下的atomic包下,發展到jdk1.8,該包...