AtomicReference原子類如何在Java中使用?相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
成都創(chuàng)新互聯(lián)公司的客戶來自各行各業(yè),為了共同目標,我們在工作上密切配合,從創(chuàng)業(yè)型小企業(yè)到企事業(yè)單位,感謝他們對我們的要求,感謝他們從不同領域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。專業(yè)領域包括成都網(wǎng)站建設、網(wǎng)站制作、電商網(wǎng)站開發(fā)、微信營銷、系統(tǒng)平臺開發(fā)。
AtomicReference介紹和函數(shù)列表
AtomicReference是作用是對"對象"進行原子操作。
AtomicReference函數(shù)列表
// 使用 null 初始值創(chuàng)建新的 AtomicReference。 AtomicReference() // 使用給定的初始值創(chuàng)建新的 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函數(shù)實現(xiàn)"原子操作。
(01) value是volatile類型。這保證了:當某線程修改value的值時,其他線程看到的value值都是最新的value值,即修改之后的volatile的值。
(02) 通過CAS設置value。這保證了:當某線程池通過CAS函數(shù)(如compareAndSet函數(shù))設置value時,它的操作是原子的,即線程在操作value時不會被中斷。
AtomicReference示例
// AtomicReferenceTest.java的源碼
import java.util.concurrent.atomic.AtomicReference; public class AtomicReferenceTest { public static void main(String[] args){ // 創(chuàng)建兩個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; } }
運行結(jié)果:
p3 is id:102 p3.equals(p1)=false
結(jié)果說明:
新建AtomicReference對象ar時,將它初始化為p1。
緊接著,通過CAS函數(shù)對它進行設置。如果ar的值為p1的話,則將其設置為p2。
最后,獲取ar對應的對象,并打印結(jié)果。p3.equals(p1)的結(jié)果為false,這是因為Person并沒有覆蓋equals()方法,而是采用繼承自Object.java的equals()方法;而Object.java中的equals()實際上是調(diào)用"=="去比較兩個對象,即比較兩個對象的地址是否相等。
看完上述內(nèi)容,你們掌握AtomicReference原子類如何在Java中使用的方法了嗎?如果還想學到更多技能或想了解更多相關內(nèi)容,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!
網(wǎng)站題目:AtomicReference原子類如何在Java中使用
標題鏈接:http://jinyejixie.com/article30/ijjhpo.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供定制開發(fā)、標簽優(yōu)化、網(wǎng)站營銷、外貿(mào)網(wǎng)站建設、全網(wǎng)營銷推廣、云服務器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)