簡體   English   中英

AtomicReference與AtomicReferenceFieldUpdater,AtomicReferenceFieldUpdater的目的是什么?

[英]AtomicReference vs AtomicReferenceFieldUpdater, what's a purpose of AtomicReferenceFieldUpdater?

我想自動升級我的參考。 例如,使用compareAndSetgetAndSet和其他原子操作。

我來自C ++,所以在C ++中,我有volatile關鍵字和不同的原子內在函數,或者是<atomic> API 在Java中,還有一個volatile關鍵字和不同的不安全原子操作

順便說一下,還有一個文檔齊全的AtomicReference (以及LongIntegerBoolean ),因此JDK的創建者為我們提供了一種對引用和基元安全地執行原子操作的方法。 API沒什么錯,它很豐富而且看起來很熟悉。

但是,還有一個AtomicReferenceFieldUpdater鞭子提供了一種執行原子操作的怪異方法:您必須通過名稱反射來“查找”字段,然后可以使用完全相同的操作。

所以我的問題是:

  1. AtomicReferenceFieldUpdater的目的是什么? 在我看來,它是隱式的並且有點奇怪:您需要聲明一個可變變量字段AND和字段更新程序本身。 那么我應該在哪里使用FieldUpdater
  2. 它提供了一種間接方式:您正在操縱 (而不是更改 !)這會造成混淆的FieldUpdater而不是變量。
  3. 性能:據我所知, AtomicReferenceFieldUpdaterAtomicReference均委托給Unsafe,因此它們的性能相似,但無論如何: FieldUpdater Reference是否有性能損失?

它用於節省內存。

doc中的示例

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 並且AtomicReferenceFieldUpdaterstatic final

如果沒有AtomicReferenceFieldUpdater ,則可能需要將它們聲明為AtomicReference<Node>

private  AtomicReference<Node> left, right;

它比Node消耗更多的內存 Node實例很多時,它比第一種方法消耗更多的內存。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM