中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

AtomicReference原子類如何在Java中使用

發布時間:2020-11-21 17:11:56 來源:億速云 閱讀:274 作者:Leah 欄目:編程語言

AtomicReference原子類如何在Java中使用?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

AtomicReference介紹和函數列表

AtomicReference是作用是對"對象"進行原子操作。

AtomicReference函數列表

// 使用 null 初始值創建新的 AtomicReference。
AtomicReference()
// 使用給定的初始值創建新的 AtomicReference。
AtomicReference(V initialValue)
// 如果當前值 == 預期值,則以原子方式將該值設置為給定的更新值。
boolean compareAndSet(V expect, V update)
// 獲取當前值。
V get()
// 以原子方式設置為給定值,并返回舊值。
V getAndSet(V newValue)
// 最終設置為給定值。
void lazySet(V newValue)
// 設置為給定值。
void set(V newValue)
// 返回當前值的字符串表示形式。
String toString()
// 如果當前值 == 預期值,則以原子方式將該值設置為給定的更新值。
boolean weakCompareAndSet(V expect, V update)

AtomicReference源碼分析(基于JDK1.7.0_40)

在JDK1.7.0_40中AtomicReference.java的源碼如下:

public class AtomicReference<V> implements java.io.Serializable {
  private static final long serialVersionUID = -1848883965231344442L;
  // 獲取Unsafe對象,Unsafe的作用是提供CAS操作
  private static final Unsafe unsafe = Unsafe.getUnsafe();
  private static final long valueOffset;
  static {
   try {
    valueOffset = unsafe.objectFieldOffset
      (AtomicReference.class.getDeclaredField("value"));
   } catch (Exception ex) { throw new Error(ex); }
  }
  // volatile類型
  private volatile V value;
  public AtomicReference(V initialValue) {
    value = initialValue;
  }
  public AtomicReference() {
  }
  public final V get() {
    return value;
  }
  public final void set(V newValue) {
    value = newValue;
  }
  public final void lazySet(V newValue) {
    unsafe.putOrderedObject(this, valueOffset, newValue);
  }
  public final boolean compareAndSet(V expect, V update) {
    return unsafe.compareAndSwapObject(this, valueOffset, expect, update);
  }
  public final boolean weakCompareAndSet(V expect, V update) {
    return unsafe.compareAndSwapObject(this, valueOffset, expect, update);
  }
  public final V getAndSet(V newValue) {
    while (true) {
      V x = get();
      if (compareAndSet(x, newValue))
        return x;
    }
  }
  public String toString() {
    return String.valueOf(get());
  }
}

說明:

AtomicReference的源碼比較簡單。它是通過"volatile"和"Unsafe提供的CAS函數實現"原子操作。

(01) value是volatile類型。這保證了:當某線程修改value的值時,其他線程看到的value值都是最新的value值,即修改之后的volatile的值。

(02) 通過CAS設置value。這保證了:當某線程池通過CAS函數(如compareAndSet函數)設置value時,它的操作是原子的,即線程在操作value時不會被中斷。

AtomicReference示例

// AtomicReferenceTest.java的源碼

import java.util.concurrent.atomic.AtomicReference;
public class AtomicReferenceTest {
  public static void main(String[] args){
    // 創建兩個Person對象,它們的id分別是101和102。
    Person p1 = new Person(101);
    Person p2 = new Person(102);
    // 新建AtomicReference對象,初始化它的值為p1對象
    AtomicReference ar = new AtomicReference(p1);
    // 通過CAS設置ar。如果ar的值為p1的話,則將其設置為p2。
    ar.compareAndSet(p1, p2);
    Person p3 = (Person)ar.get();
    System.out.println("p3 is "+p3);
    System.out.println("p3.equals(p1)="+p3.equals(p1));
  }
}
class Person {
  volatile long id;
  public Person(long id) {
    this.id = id;
  }
  public String toString() {
    return "id:"+id;
  }
}

運行結果:

p3 is id:102
p3.equals(p1)=false

結果說明:

新建AtomicReference對象ar時,將它初始化為p1。

緊接著,通過CAS函數對它進行設置。如果ar的值為p1的話,則將其設置為p2。

最后,獲取ar對應的對象,并打印結果。p3.equals(p1)的結果為false,這是因為Person并沒有覆蓋equals()方法,而是采用繼承自Object.java的equals()方法;而Object.java中的equals()實際上是調用"=="去比較兩個對象,即比較兩個對象的地址是否相等。

看完上述內容,你們掌握AtomicReference原子類如何在Java中使用的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

山东| 株洲县| 岳普湖县| 德令哈市| 普兰店市| 确山县| 潜山县| 马边| 东阿县| 阿克| 溧水县| 囊谦县| 汤原县| 越西县| 丹东市| 广水市| 贵阳市| 浦东新区| 电白县| 都匀市| 磴口县| 庆安县| 平湖市| 吉安县| 亳州市| 固阳县| 侯马市| 互助| 博客| 台中县| 五家渠市| 香格里拉县| 石渠县| 泰兴市| 远安县| 宜兴市| 耿马| 丽水市| 汶川县| 盱眙县| 通江县|