2

Java では、AtomicMarkableReferenceを使用して、オブジェクト参照をマーク ビットとともにアトミックに更新できます。

javadocには次のように記載されています。

実装に関する注意: この実装は、「ボックス化された」[参照、ブール値] ペアを表す内部オブジェクトを作成することにより、マーク可能な参照を維持します。

これは、クラスの Java 8 ソース コードで確認できる内容によると、当てはまります。

package java.util.concurrent.atomic;

public class AtomicMarkableReference<V> {

    private static class Pair<T> {
        final T reference;
        final boolean mark;
        private Pair(T reference, boolean mark) {
            this.reference = reference;
            this.mark = mark;
        }
        static <T> Pair<T> of(T reference, boolean mark) {
            return new Pair<T>(reference, mark);
        }
    }

    private volatile Pair<V> pair;

    public AtomicMarkableReference(V initialRef, boolean initialMark) {
        pair = Pair.of(initialRef, initialMark);
    }

    // [...] class methods
}

クラスのgetメソッドの設計の背後にある理由はありますか?

public V get(boolean[] markHolder) {
    Pair<V> pair = this.pair;
    markHolder[0] = pair.mark;
    return pair.reference;
}

(値のペアを返す代わりに) そのようなブール配列を使用するポイントは何ですか? 並行性主導の選択ですか? それともレガシーコードですか?

4

1 に答える 1