AtomicReferenceFieldUpdater対AtomicReference、AtomicReferenceFieldUpdaterの目的は何ですか?

Netherwire:

私はアトミック私の参照をアップグレードしたいと思います。使用例compareAndSetgetAndSetおよび他のアトミック操作。

私は、C ++からそうC ++で、私が持って来たvolatileキーワードと異なる原子組み込み関数、または<atomic> APIをJavaでは、またありますvolatileキーワードと異なる危険なアトミック操作

ところで、よく文書もありますAtomicReference(だけでなく、はLongIntegerBooleanので)、JDKのクリエイターが私たちに安全に言及とプリミティブに対してアトミック操作を実行する方法を提供します。何も間違っては、それが豊富で、非常に身近なようで、APIについてあります。

しかし、もありますAtomicReferenceFieldUpdaterアトミック操作を実行するためのちょっと奇妙な方法を提供しwhickは:あなたが名前による反射を介したフィールドを「検索」する必要があり、その後、あなたはまったく同じ操作を使用することができます。

だから、私の質問は以下のとおりです。

  1. 目的は何ですかAtomicReferenceFieldUpdaterすべてでは?私の意見では、暗黙的とちょっと奇妙である:あなたが提出された揮発性の変数を宣言する必要がある自分自身のアップデータとフィールドを。だからここで私が使用する必要がありますかFieldUpdater
  2. これは、間接を提供します:あなたがしている操作(ない変更!) FieldUpdaterいない変数をこの混乱を。
  3. パフォーマンス:私の知る限り、両方AtomicReferenceFieldUpdaterAtomicReference彼らのパフォーマンスが似ているので、安全でないに委任されているが、とにかく:のいずれかのパフォーマンスの低下があるFieldUpdateragaistリファレンスは?
xingbin:

メモリを節約するために使用されます。

ドキュメントから:

class Node {
   private volatile Node left, right;

   private static final AtomicReferenceFieldUpdater<Node, Node> leftUpdater =
     AtomicReferenceFieldUpdater.newUpdater(Node.class, Node.class, "left");
   private static AtomicReferenceFieldUpdater<Node, Node> rightUpdater =
     AtomicReferenceFieldUpdater.newUpdater(Node.class, Node.class, "right");

   Node getLeft() { return left; }
   boolean compareAndSetLeft(Node expect, Node update) {
     return leftUpdater.compareAndSet(this, expect, update);
   }
   // ... and so on
 }

それが宣言するleftrightのようにNode直接。そして、AtomicReferenceFieldUpdaterありますstatic final

なければAtomicReferenceFieldUpdater、あなたは、それらを宣言する必要がありますAtomicReference<Node>

private  AtomicReference<Node> left, right;

これは、より多くのメモリを消費しますNode多くのインスタンスが存在する場合Node、それは最初のアプローチよりもはるかに多くのメモリを消費します。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=203211&siteId=1