生活随笔
收集整理的這篇文章主要介紹了
java多线程--AtomicReference
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
AtomicReference介紹
AtomicReference是作用是對(duì)"對(duì)象"進(jìn)行原子操作。
AtomicReference源碼分析(基于JDK1.7.0_40)
在JDK1.7.0_40中AtomicReference.java的源碼如下:
[java]?view plaincopy
public?class?AtomicReference<V>??implements?java.io.Serializable?{??????private?static?final?long?serialVersionUID?=?-1848883965231344442L;????????????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);?}??????}????????????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());??????}??}<span?style="font-family:?'Courier?New'?!important;?font-size:?12px?!important;?line-height:?1.5?!important;?color:?rgb(0,?0,?0);"></span>?? 說(shuō)明:
AtomicReference的源碼比較簡(jiǎn)單。它是通過(guò)"volatile"和"Unsafe提供的CAS函數(shù)實(shí)現(xiàn)"原子操作。
(01) value是volatile類型。這保證了:當(dāng)某線程修改value的值時(shí),其他線程看到的value值都是最新的value值,即修改之后的volatile的值。
(02) 通過(guò)CAS設(shè)置value。這保證了:當(dāng)某線程池通過(guò)CAS函數(shù)(如compareAndSet函數(shù))設(shè)置value時(shí),它的操作是原子的,即線程在操作value時(shí)不會(huì)被中斷。
?
AtomicReference示例
[java]?view plaincopy
import?java.util.concurrent.atomic.AtomicReference;????public?class?AtomicReferenceTest?{????????????public?static?void?main(String[]?args){????????????????????Person?p1?=?new?Person(101);??????????Person?p2?=?new?Person(102);??????????????????AtomicReference?ar?=?new?AtomicReference(p1);??????????????????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;??????}??}<span?style="font-family:?'Courier?New'?!important;?font-size:?12px?!important;?line-height:?1.5?!important;?color:?rgb(0,?0,?0);"></span>?? 運(yùn)行結(jié)果:
[java] p3?is?id:102??p3.equals(p1)=false<span?style="font-family:?'Courier?New'?!important;?font-size:?12px?!important;?line-height:?1.5?!important;?color:?rgb(0,?0,?255);"></span>?? 結(jié)果說(shuō)明:
新建AtomicReference對(duì)象ar時(shí),將它初始化為p1。
緊接著,通過(guò)CAS函數(shù)對(duì)它進(jìn)行設(shè)置。如果ar的值為p1的話,則將其設(shè)置為p2。
最后,獲取ar對(duì)應(yīng)的對(duì)象,并打印結(jié)果。p3.equals(p1)的結(jié)果為false,這是因?yàn)镻erson并沒(méi)有覆蓋equals()方法,而是采用繼承自O(shè)bject.java的equals()方法;而Object.java中的equals()實(shí)際上是調(diào)用"=="去比較兩個(gè)對(duì)象,即比較兩個(gè)對(duì)象的地址是否相等。
總結(jié)
以上是生活随笔為你收集整理的java多线程--AtomicReference的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。