私はアトミック私の参照をアップグレードしたいと思います。使用例compareAndSet
、getAndSet
および他のアトミック操作。
私は、C ++からそうC ++で、私が持って来たvolatile
キーワードと異なる原子組み込み関数、または<atomic>
APIを。Javaでは、またありますvolatile
キーワードと異なる危険なアトミック操作。
ところで、よく文書もありますAtomicReference(だけでなく、はLong
、Integer
、Boolean
ので)、JDKのクリエイターが私たちに安全に言及とプリミティブに対してアトミック操作を実行する方法を提供します。何も間違っては、それが豊富で、非常に身近なようで、APIについてあります。
しかし、もありますAtomicReferenceFieldUpdaterアトミック操作を実行するためのちょっと奇妙な方法を提供しwhickは:あなたが名前による反射を介したフィールドを「検索」する必要があり、その後、あなたはまったく同じ操作を使用することができます。
だから、私の質問は以下のとおりです。
- 目的は何ですか
AtomicReferenceFieldUpdater
すべてでは?私の意見では、暗黙的とちょっと奇妙である:あなたが提出された揮発性の変数を宣言する必要があると自分自身のアップデータとフィールドを。だからここで私が使用する必要がありますかFieldUpdater
? - これは、間接を提供します:あなたがしている操作(ない変更!)
FieldUpdater
、いない変数をこの混乱を。 - パフォーマンス:私の知る限り、両方
AtomicReferenceFieldUpdater
とAtomicReference
彼らのパフォーマンスが似ているので、安全でないに委任されているが、とにかく:のいずれかのパフォーマンスの低下があるFieldUpdater
agaistリファレンスは?
メモリを節約するために使用されます。
例ドキュメントから:
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
}
それが宣言するleft
とright
のようにNode
直接。そして、AtomicReferenceFieldUpdater
ありますstatic final
。
なければAtomicReferenceFieldUpdater
、あなたは、それらを宣言する必要がありますAtomicReference<Node>
。
private AtomicReference<Node> left, right;
これは、より多くのメモリを消費しますNode
。多くのインスタンスが存在する場合Node
、それは最初のアプローチよりもはるかに多くのメモリを消費します。