1. 程式人生 > 其它 >java面經-原子類

java面經-原子類

一、JUC包中原子類包括了哪四類

1、基本型別

  1.1AtomicInteger:整形原子類

  1.2AtomicLong:長整型原子類

  1.3AtomicBoolean:布林型原子類

2、陣列型別

  2.1AtomicIntegetArray:整形陣列原子類

  2.2AtomicLongArray:長整形陣列原子類

  2.3AtomicReferenceArray:引用型別陣列原子類

3、引用型別

  3.1AtomicReference:引用型別原子類

  3.2AtomicStampedReference:原子更新帶有版本號的應用型別,該型別將數值與引用關聯起來,可用於解決原子的

更新資料和版本號,可以解決使用CAS進行原子更新時可能出現的ABA問題。

  3,3AtomicMarkableReference:原子更新帶有標記為的引用型別。

4、物件的屬性修改型別

  4.1AtomicReferenceFieldUpdater:原子更新應用型別欄位的更新器

 

三、AtomicInteger的使用

AtomicInteger類常用方法

public final int get() //獲取當前的值
public final int getAndSet(int newValue)//獲取當前的值,並設定新的值
public final int getAndIncrement()//獲取當前的值,並自增
public final int getAndDecrement() //獲取當前的值,並自減
public final int getAndAdd(int delta) //獲取當前的值,並加上預期的值
boolean compareAndSet(int expect, int update) //如果輸入的數值等於預期值,則以原子方式將該值設定為輸入值(update)
public final void lazySet(int newValue)//最終設定為newValue,使用 lazySet 設定之後可能導致其他執行緒在之後的一小段時間內還是可以讀到舊的值。

  使用原子類後,不用對方法加鎖也可以保證執行緒安全。

 

四、介紹AtomicInteger類的原理

AtomicIntegert主要利用的還是CAS+volatile和native方法保證原子操作,避免了synchronized的高開銷,執行效率就可以大為提升。

UnSafe 類的 objectFieldOffset() 方法是一個本地方法,這個方法是用來拿到“原來的值”的記憶體地址,返回值是 valueOffset。

另外 value 是一個 volatile 變數,在記憶體中可見,因此 JVM 可以保證任何時刻任何執行緒總能拿到該變數的最新值。