Jdk 1.6 JUCソース解析(4)-atomic Stopedireference、AtomicMarcable Reference
Jdk 1.6 JUCソース解析(4)-atomic Stopedireference、AtomicMarcable Reference
作者:大飛
機能概要: CAS中のABA問題を回避するために、AtomicStopedereferenceとAtomicMarcable Referenceの二つの種類を提供します。前者は「参照、integer」の二元グループに相当し、後者は「引用、bollan」の二元グループに相当する。 AtomicStation referenceは、バージョン番号付き原子参照として使用することができ、AtomicMarcable Referenceは、削除されたノードを表すために使用することができる。 注:ABA問題はCASの操作中に目標値を1から2に変更したいと仮定していますが、一般的には1かどうかの検査対象値です。1の場合は2に設定します。しかし、検出前に目標値が3になり、また1になった可能性があります。検出過程では、このような変化を察知することはできません。これは普通は影響がありませんが、場合によっては問題になるかもしれません。
ソース分析:まずAtomicStation referenceの内部構造を見てください。
AtomicMarcable Referenceでも同様の構造です。
他のコードは分かりやすいです。ここでは具体的な分析はしません。
ソースコードはここまで分析します。
参照:Jdk 1.6 JUCソース解析(1)-atomicXXX
作者:大飛
機能概要:
ソース分析:
public class AtomicStampedReference<V> {
private static class ReferenceIntegerPair<T> {
private final T reference;
private final int integer;
ReferenceIntegerPair(T r, int i) {
reference = r; integer = i;
}
}
private final AtomicReference<ReferenceIntegerPair<V>> atomicRef;
/**
* Creates a new {@code AtomicStampedReference} with the given
* initial values.
*
* @param initialRef the initial reference
* @param initialStamp the initial stamp
*/
public AtomicStampedReference(V initialRef, int initialStamp) {
atomicRef = new AtomicReference<ReferenceIntegerPair<V>>
(new ReferenceIntegerPair<V>(initialRef, initialStamp));
}
これは、AtomicStation reference内部では、ReferenceIntegerPairを引用して、AtomicReferenceを使用して、この引用を原子更新することができます。AtomicMarcable Referenceでも同様の構造です。
public class AtomicMarkableReference<V> {
private static class ReferenceBooleanPair<T> {
private final T reference;
private final boolean bit;
ReferenceBooleanPair(T r, boolean i) {
reference = r; bit = i;
}
}
private final AtomicReference<ReferenceBooleanPair<V>> atomicRef;
/**
* Creates a new {@code AtomicMarkableReference} with the given
* initial values.
*
* @param initialRef the initial reference
* @param initialMark the initial mark
*/
public AtomicMarkableReference(V initialRef, boolean initialMark) {
atomicRef = new AtomicReference<ReferenceBooleanPair<V>> (new ReferenceBooleanPair<V>(initialRef, initialMark));
}
他のコードは分かりやすいです。ここでは具体的な分析はしません。
ソースコードはここまで分析します。
参照:Jdk 1.6 JUCソース解析(1)-atomicXXX