これらの3つが自己JDK1.5は以下は、java.util.concurrent.atomicに参加し始めています。彼らはアトミックロックフリーの場合のオブジェクト参照を更新することができます。
一、AtomicReference
アトミックオブジェクト参照を更新します。
静的 クラスユーザー{ プライベート int型の年齢; 公共 int型getAge(){ 戻り値の年齢。 } 公共 ボイド setAge(int型の年齢){ この .age = 年齢。 } パブリックユーザ(int型の年齢){ この .age = 年齢。 } } パブリック 静的 ボイドメイン(文字列[]引数){ ユーザーUser1が = 新しいユーザー(10 )。 ユーザuser2 = 新しいユーザー(20); AtomicReference <ユーザー> atomicReference = 新しい AtomicReference <> (USER1)。 System.out.println(atomicReference.get()getAge()。)。 atomicReference.compareAndSet(ユーザー1、ユーザー2)。 System.out.println(atomicReference.get()getAge()。)。 }
二、AtomicStampedReference
ABAは存在CAS操作で問題AtomicReferenceを解決します。
パブリック 静的 ボイドメイン(文字列[]引数){ ユーザーUSER1 = 新しい新しいユーザ(10 )、 ユーザuser2 = 新しい新規のユーザ(20である); AtomicStampedReference <ユーザー> stampedReference = 新しい新規アンAtomicStampedReference <>(USER1 ,. 1 ); int型 []スタンプ= 新しい新しい INT [1 ]; // 参照オブジェクトとそれに対応するバージョン番号を取得 するSystem.out.println(stampedReference.get(スタンプ).getAge()); INT oldStampスタンプ= [0 ]; // 予想参照に新しい参照、予想されるバージョン番号は、新しいバージョン番号 stampedReference.compareAndSet(ユーザー1、ユーザー2、oldStamp、 2); System.out.println(stampedReference.get(スタンプ).getAge()); }
バージョン番号への参照を追加することに相当するペアオブジェクトの内部定義
パブリック クラス AtomicStampedReference <V> { プライベート 静的 クラスペア<T> { 最終的なT参照。 最終 int型スタンプ。 プライベートペア(T基準、int型のスタンプ){ この .reference = 参照。 この .stamp = スタンプ。 } 静的 <T>対<T>(T参照のINTのスタンプ){ 戻り 、新しい <T>ペア(参照、スタンプ)。 } } プライベート 揮発性対<V> 対; 公共 AtomicStampedReference(V initialRef、int型initialStamp)を{ 一対 = Pair.of(initialRef、initialStamp)。 }
論理置換、参照のみと同一のバージョン番号CASの交換を使用している場合
パブリック ブールのcompareAndSet(V expectedReference、V newReference、INT expectedStamp、INT newStamp){ ペア <V>現行= 一対。 戻り expectedReference == current.reference && expectedStamp == current.stamp && ((newReference == current.reference && newStamp == current.stamp)|| casPair(現在、Pair.of(newReference、newStamp)))。 } プライベート ブール casPair(ペア<V> CMP、ペア<V> ヴァル){ リターンUNSAFE.compareAndSwapObject(この、pairOffset、CMP、ヴァル)。 }
三、AtomicMarkableReference
AtomicStampedReferenceと比較して、時々、私たちは何度か変更しましたが、変更されたかどうかについて単に心配参照変数を気にしません
パブリック 静的 ボイドメイン(文字列[]引数){ ユーザーUSER1 = 新しい新しいユーザ(10 )、 ユーザuser2 = 新しい新規のユーザ(20である); AtomicMarkableReference <ユーザー> stampedReference = 新しい新規アンAtomicMarkableReference <>(USER1、偽に); ブール []スタンプ= 新しい新しい ブール値 [1 ]; //は、基準オブジェクトと対応する状態取得 するSystem.out.println(stampedReference.get(スタンプ).getAgeを()); ブール oldStampスタンプ= [0 ]; // 予想参照、新たな参照は、それが意図されています状態、新しい状態 stampedReference.compareAndSet(ユーザー1、ユーザー2、oldStamp、偽); System.out.println(stampedReference.get(スタンプ).getAge()); }
内部とAtomicStampedReferenceのように
パブリック クラス AtomicMarkableReference <V> { プライベート 静的 クラスペア<T> { 最終的なT参照。 最終 ブールマーク。 プライベートペア(T基準、ブールマーク){ この .reference = 参照。 この .mark = マーク。 } 静的 <T>対<T>(T基準のブールマーク){ 戻り 新しいペア<T> (参照マーク)。 } } プライベート 揮発性のペア<V> ペア。 公共 AtomicMarkableReference(V initialRef、ブールinitialMark){ 一対 = Pair.of(initialRef、initialMark)。 } パブリック ブールのcompareAndSet(V expectedReference、V newReference、ブール expectedMark、ブールニューマーク){ ペア <V>現行= 一対。 返す expectedReference == current.reference && expectedMark == current.mark && ((newReference == current.reference && ニューマークは)current.markを== || casPair(現在、Pair.of(newReference、ニューマーク)))。 } プライベート ブール casPair(ペア<V> CMP、ペア<V> ヴァル){ 戻り UNSAFE.compareAndSwapObject(この、pairOffset、CMP、ヴァル)を、 }