CAS原子操作 -- JDK實現原子操作類

一:概述

多線程的數據安全問題一直是比較常見的多線程問題,衍生出系列如 ++ 運算線程安全,dubbo、long等64位操作數據安全問題。Java自JDK1.5開始,爲基本類型、數組、引用對象類型等數據都提供了對應的原子操作類,即線程安全的操作類,其底層採用Unsafe類實現

二:基礎類型

基本類型原子操作類JDK中提供三種實現,AtomicInteger、AtomicLong、AtomicBoolean分別對應int、long、boolean類型。至於其餘五種基本類型都可以仿照AtomicBoolean自定義實現

2.1 AtomicInteger

因爲實現的操作基本都類似,所以就以AtomicInteger爲代表進行分析,當然後續會講述AtomicBoolean的實現原理。下面介紹幾個典型API實現
在這裏插入圖片描述
調用本地方法實現,核心思想在於將內存值與期望值進行比較後修改內存值。第一個參數爲期望值即原內存值,第二個參數爲修改值即更新修改後的內存值
在這裏插入圖片描述
這個API方法就是將原內存值進行一定操作後重新賦值。參數IntUnaryOperator接口是一個函數式接口,applyAsInt()方法入參參數爲原內存值,返回操作後的數值作爲更新值

在這裏插入圖片描述
在這裏插入圖片描述
將原內存值增加修改並進行重新賦值,increment自增操作類似

2.2 AtomicBoolean

前面講到JDK提供的基礎原子操作只有三類,其中AtomicBoolean實現可以作爲其餘五種基礎類型實現模板。Unsafe只提供了數值操作,其餘的操作基本都是轉換爲數值後再執行。以AtomicBoolean爲例如下所示
在這裏插入圖片描述

三:數組

原子更新數組提供的類型與原子更新基本類型基本一致,提供AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray三個原子類,分別針對int類型數組,long類型數組以及引用類型數組

在這裏插入圖片描述
以AtomicIntegerArray爲例,其中比較賦值操作相對於AtomicInteger類來講就是多了參數執行數組下標。數組數據的更新需要根據數組下標進行定義

四:引用類型

前面基本類型原子操作提供了三個原子操作類,當對象爲引用類型的時候JDK也提供了對應的原子操作類AtomicReference、AtomicReferenceFieldUpdater。分別對應原子操作引用類型對象以及引用對象類型屬性
在這裏插入圖片描述

五:版本原子操作

原子操作本質是CAS操作,CAS操作中有個經典的問題就是ABA版本問題。JDK中提供AtomicStampedReference類解決ABA問題。該類相對於其它原子操作類就是多一個版本號參數,通過比較版本號參數解決ABA問題
在這裏插入圖片描述
其中還有一個與AtomicStampedReferemce類似的原子操作類AtomicMarkableReference,該類相對於AtomicStampedReference來講採用boolean類型作爲版本標記,只關心是否已經被修改
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章