Используется для экономии памяти.
Пример из документа:
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
, он потребляет гораздо больше памяти, чем первый подход.