Есть ли какая-то разница между volatile
ссылкой на объект и AtomicReference
в случае, если бы я просто использовал get()
и set()
-методы из AtomicReference
?
java
concurrency
Auramo
источник
источник
Нет, нет
Дополнительные возможности, предоставляемые AtomicReference, - это метод compareAndSet () и друзья. Если вам не нужны эти методы, переменная ссылка предоставляет ту же семантику, что и AtomicReference.set () и .get ().
источник
Есть несколько отличий и компромиссов:
Использование
AtomicReference
get / set имеет ту же семантику JMM, что и энергозависимое поле (как состояния javadoc), ноAtomicReference
является оберткой вокруг ссылки, поэтому любой доступ к полю включает дальнейшую погоню за указателем .Объем памяти увеличивается (при условии сжатой среды ООП, что справедливо для большинства виртуальных машин):
AtomicReference
= 4b + 16b (заголовок объекта 12b + поле ссылки 4b)AtomicReference
предлагает более богатый API, чем нестабильная ссылка. Вы можете восстановить API для энергозависимой ссылки с помощьюAtomicFieldUpdater
или с помощью Java 9 aVarHandle
. Вы также можете связаться прямо,sun.misc.Unsafe
если вам нравится бегать с ножницами.AtomicReference
Сам реализован с помощьюUnsafe
.Итак, когда это хорошо, чтобы выбрать один над другим:
AtomicReference
/AtomicFieldUpdater
/,Unsafe
где вы склонны платить за удобочитаемость и риск увеличения производительности. Если это не чувствительная область просто пойтиAtomicReference
. Авторы библиотек обычно используют сочетание этих методов в зависимости от целевых JDK, ожидаемых ограничений API, ограничений памяти и так далее.источник
Исходный код JDK - один из лучших способов решить такую проблему. Если вы посмотрите на код в AtomicReference, он использует переменную volatie для хранения объектов.
Итак, очевидно, что если вы собираетесь просто использовать get () и set () в AtomicReference, это похоже на использование переменной volatile. Но, как отметили другие читатели, AtomicReference предоставляет дополнительную семантику CAS. Итак, сначала решите, хотите ли вы семантику CAS или нет, и если вы делаете только тогда, используйте AtomicReference.
источник
AtomicReference
обеспечивает дополнительную функциональность, которую не обеспечивает обычная переменная переменная. Когда вы прочитали API Javadoc, вы это узнаете, но он также предоставляет блокировку, которая может быть полезна для некоторых операций.Однако, если вам не нужны эти дополнительные функции, я предлагаю вам использовать простое
volatile
поле.источник
volatile
Поле можно использовать как любое обычное поле, тогда как для доступа к значениюAtomicReference
требуется пройти через методыget
иset
методы.Иногда, даже если вы используете только get и set, AtomicReference может быть хорошим выбором:
Пример с volatile:
Реализация с AtomicReference обеспечит вам бесплатную синхронизацию копирования при записи.
Можно сказать, что у вас все еще может быть правильная копия, если вы замените:
с участием:
Однако второй, скорее всего, будет случайно удален кем-то в будущем во время «очистки кода».
источник