[英]AtomicReference vs AtomicReferenceFieldUpdater, what's a purpose of AtomicReferenceFieldUpdater?
我想自動升級我的參考。 例如,使用compareAndSet
, getAndSet
和其他原子操作。
我來自C ++,所以在C ++中,我有volatile
關鍵字和不同的原子內在函數,或者是<atomic>
API 。 在Java中,還有一個volatile
關鍵字和不同的不安全原子操作 。
順便說一下,還有一個文檔齊全的AtomicReference (以及Long
, Integer
, Boolean
),因此JDK的創建者為我們提供了一種對引用和基元安全地執行原子操作的方法。 API沒什么錯,它很豐富而且看起來很熟悉。
但是,還有一個AtomicReferenceFieldUpdater鞭子提供了一種執行原子操作的怪異方法:您必須通過名稱反射來“查找”字段,然后可以使用完全相同的操作。
所以我的問題是:
AtomicReferenceFieldUpdater
的目的是什么? 在我看來,它是隱式的並且有點奇怪:您需要聲明一個可變變量字段AND和字段更新程序本身。 那么我應該在哪里使用FieldUpdater
? FieldUpdater
而不是變量。 AtomicReferenceFieldUpdater
和AtomicReference
均委托給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
}
它直接將left
和right
聲明為Node
。 並且AtomicReferenceFieldUpdater
是static final
。
如果沒有AtomicReferenceFieldUpdater
,則可能需要將它們聲明為AtomicReference<Node>
。
private AtomicReference<Node> left, right;
它比Node
消耗更多的內存 。 當Node
實例很多時,它比第一種方法消耗更多的內存。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.