2

JavaでAtomicMarkableReferenceを使用して、マークビットとともにオブジェクト参照をアトミックに更新することができます。JavaのAtomicMarkableReferenceの "get"メソッド実装の背後にある理由は何ですか?

javadoc状態:

実装注:この実装は、「箱入り」[参照、ブール]ペアを表す内部オブジェクトを作成することにより、マーキングの参照を維持します。

これは、クラスのJavaの8ソースコードで見ることができるかに応じて真である:クラスのget方法の設計の背後にある理由は

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 
} 

ありますか?

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

(値のペアを返す代わりに)このようなブール値の配列を使用する点は何ですか?同時実行性の選択ですか?あるいはレガシーコードでしょうか?

+0

Javaには、「ペア」タイプがありません。 –

+0

(さらに、Javaは、このような 'Pair'タイプに基づく実装を使用して_always_に自己を結びつけたくありませんでした。) –

答えて

3

これは、標準ライブラリにprivate static class Pairのクラスが少なくとも3つあるにもかかわらず、JavaにはPair<L, R>クラスがなく、おそらくそうでないためです。 Pairクラスを追加することは、OpenJDK開発者によって複数回にわたって議論され、提案は常に拒否されました。 Thisメールは(また、全体のメールスレッドは非常に便利です)ペアが標準クラスとして提示すべきではない理由は非常に良い説明です:

問題はペアのようなクラスは、単に を楽しむためにそれだけ先に進むということです私たち自身の実際のタイプを作成する必要は決してありません。 独自のタイプを作成する必要があるときは、より正確に のデータをモデル化し始めます。これは、 という広範なレベルの細かい抽象を作成するために私たちを導いてくれると考えています。

は限りそのPairクラスを公開していないと、Javaであなたは(そのような変更は、発信者によって観察可能になるような方法で)渡されたリファレンスの値を変更することはできませんAtomicMarkableReferenceとして、唯一の方法は、両方の参照を返しますビットフラグはメソッドから1つを返し、引数の配列として2番目に渡します。つまり、並行性ではなく、遺産についてでもなく、言語デザインの意思決定でもありません。

+1

ありがとうございました!今私はJavaの背後にあるデザインの選択を理解しています。 –

関連する問題