JUC原子类-引用类型(四)
生活随笔
收集整理的這篇文章主要介紹了
JUC原子类-引用类型(四)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
AtomicReference介紹:
AtomicReference是作用是對”對象”進行原子操作。
AtomicLong函數列表
// 使用 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源碼分析
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時不會被中斷。
例子:
// 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;} }總結
以上是生活随笔為你收集整理的JUC原子类-引用类型(四)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JUC原子类-数组类型(三)
- 下一篇: JUC原子类-类成员(五)