AtomicReference vs AtomicReferenceFieldUpdater, какова цель AtomicReferenceFieldUpdater? - PullRequest
0 голосов
/ 07 октября 2018

Я бы хотел обновить свою ссылку.Например, чтобы использовать compareAndSet, getAndSet и другие атомарные операции.

Я пришел из C ++, поэтому в C ++ у меня есть ключевое слово volatile и различные атомарные свойства, или <atomic> API .В Java также есть ключевое слово volatile и различные небезопасные атомарные операции .

Кстати, есть также хорошо документированная AtomicReference (а также Long, Integer, Boolean), поэтому создатели JDK предоставили нам способ безопасного выполнения атомарных операций со ссылками и примитивами.В API нет ничего плохого, он богат и кажется очень знакомым.

Но есть также AtomicReferenceFieldUpdater , который обеспечивает довольно странный способ выполнения атомарных операций: вам нужно «найти»поле через отражение по имени, и тогда вы можете использовать точно такие же операции.

Итак, мои вопросы:

  1. Какова цель AtomicReferenceFieldUpdater вообще?На мой взгляд, это неявно и довольно странно: вам нужно объявить переменную volifled AND и само поле обновления.Так, где я должен использовать FieldUpdater?
  2. Это обеспечивает косвенное направление: вы манипулируете (не изменяете !) FieldUpdater, а не переменнуюЭто сбивает с толку.
  3. Производительность: насколько я знаю, и AtomicReferenceFieldUpdater, и AtomicReference делегируют Unsafe, поэтому их производительность аналогична, но в любом случае: есть ли какие-либо потери производительности FieldUpdaterСправочник agaist?

1 Ответ

0 голосов
/ 07 октября 2018

Используется для экономии памяти.

Пример из документа:

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

...