Изменчивая ссылка Java против AtomicReference

java concurrency

34828 просмотра

5 ответа

6787 Репутация автора

Есть ли какая-то разница между volatileссылкой на объект и AtomicReferenceв случае, если я просто использую get()и set()-методы из AtomicReference?

Автор: auramo Источник Размещён: 11.11.2008 03:04

Ответы (5)


109 плюса

11395 Репутация автора

Решение

Краткий ответ: Нет.

Из документа пакета java.util.concurrent.atomic :

Эффекты памяти для доступа и обновлений атомики обычно следуют правилам для летучих:

  • getимеет эффекты памяти чтения volatileпеременной.
  • setимеет эффект памяти записи (присваивания) volatileпеременной.

Кстати, документация для пакета очень хорошая, и все объясняется ...


lazySet(представлен в Java 6) - это более новая введенная операция, в которой семантика недостижима через volatileпеременные; см. этот пост для получения дополнительной информации.

Автор: pgras Размещён: 11.11.2008 03:17

40 плюса

18380 Репутация автора

Нет, нет.

Дополнительные возможности, предоставляемые AtomicReference, - это метод compareAndSet () и друзья. Если вам не нужны эти методы, переменная ссылка предоставляет ту же семантику, что и AtomicReference.set () и .get ().

Автор: Avi Размещён: 11.11.2008 03:20

2 плюса

463335 Репутация автора

AtomicReference предоставляет дополнительные функциональные возможности, которые не предоставляет обычная переменная переменная. Когда вы прочитали API, вы это знаете, но он также предоставляет блокировку, которая может быть полезна для некоторых операций.

Однако, если вам не нужны эти дополнительные функции, я предлагаю вам использовать простое изменчивое поле.

Автор: Peter Lawrey Размещён: 30.01.2009 08:35

6 плюса

1682 Репутация автора

Исходный код JDK - один из лучших способов ответить на подобные ошибки. Если вы посмотрите на код в AtomicReference, он использует переменную volatie для хранения объектов.

private volatile V value;

Итак, очевидно, что если вы собираетесь просто использовать get () и set () в AtomicReference, это похоже на использование переменной volatile. Но, как прокомментировали другие читатели, AtomicReference предоставляет дополнительную семантику CAS. Итак, сначала решите, хотите ли вы семантику CAS или нет, и если вы делаете только тогда, используйте AtomicReference.

Автор: endless Размещён: 03.02.2013 03:24

10 плюса

2005 Репутация автора

Есть несколько различий и компромиссов:

  1. Использование AtomicReferenceget / set имеет ту же семантику JMM, что и энергозависимое поле (как состояния javadoc), но AtomicReferenceявляется оберткой вокруг ссылки, поэтому любой доступ к полю включает дальнейшую погоню за указателем .

  2. Объем памяти увеличивается (при условии сжатой среды ООП, что справедливо для большинства виртуальных машин):

    • изменчивый ref = 4b
    • AtomicReference = 4b + 16b (заголовок объекта 12b + поле ссылки 4b)
  3. AtomicReferenceпредлагает более богатый API, чем нестабильная ссылка. Вы можете восстановить API для энергозависимой ссылки с помощью AtomicFieldUpdaterили с помощью Java 9 a VarHandle. Вы также можете связаться прямо, sun.misc.Unsafeесли вам нравится бегать с ножницами. AtomicReferenceСам реализован с помощью Unsafe.

Итак, когда это хорошо, чтобы выбрать один над другим:

  • Нужно только получить / установить? Придерживайтесь изменчивого поля, простейшего решения и минимальных накладных расходов.
  • Нужна дополнительная функциональность? Если это часть кода, чувствительная к производительности (скорости / накладным расходам памяти), сделайте выбор между AtomicReference/ AtomicFieldUpdater/, Unsafeгде вы склонны платить за удобочитаемость и риск увеличения производительности. Если это не чувствительная область, просто зайдите AtomicReference. Авторы библиотек обычно используют сочетание этих методов в зависимости от целевых JDK, ожидаемых ограничений API, ограничений памяти и так далее.
Автор: Nitsan Wakart Размещён: 19.07.2017 10:10
Вопросы из категории :
32x32