Подтвердить что ты не робот

Назначение ссылок является атомарным, поэтому зачем использовать AtomicReference

У меня есть простой общий вопрос об AtomicReference.

Зачем использовать AtomicReference, если назначение ссылок является атомарным в java?

Также я хотел бы спросить, является ли ссылка ссылкой атомарной в 64-разрядных виртуальных машинах?

Нужна ли нам волатильность, чтобы иметь ссылочный выбор атома?

4b9b3361

Ответ 1

Мой предыдущий ответ был неправильным, как описано в комментарии от juancn:

Это разница между классами Atomic* и изменчивым доступом. Назначение ссылок является атомарным только в том смысле, что разрыв слова не может произойти, но нет никаких гарантий видимости или переупорядочения. Java гарантирует атомную запись в этом ограниченном смысле для всех примитивных типов и ссылок, но не для long/double (хотя в 64-битных виртуальных машинах я думаю, что они всегда атомарны).

Предыдущий ответ

Это необходимо, главным образом для методов compareAndSet и getAndSet. Вы не можете делать это атомарно иначе (требуется 2 операции).

Ответ 2

Зачем использовать AtomicReference, если назначение ссылок является атомарным в java?

Вам это нужно, когда решение, на основе которого создается новое значение, может зависеть от предыдущего значения ссылки. Например, при реализации некоторой структуры данных LinkedList, которую вы не хотите, установите головку на новый node, который ссылается на предыдущий node. В то время между чтением предыдущего node и установкой головки на новую другой поток мог бы одновременно обновляемый опорное значение напора. Если наш поток не будет знать об этом изменении, он потеряется.

Нужна ли нам волатильность, чтобы иметь ссылочный выбор атома?

Сама операция будет выполняться атомом на ядре центрального процессора, но нет никаких гарантий того, что потоки на других ядрах будут знать об этом при следующем чтении.

Ответ 3

Причина в том, что, хотя эта ссылка является атомарной, она является атомарной в очень узком смысле.

Если поток пишет нелетучую ссылку, то гарантируется, что другие потоки будут видеть всю запись или вообще не видеть ее (без разрыва слова/мусора).

Но ни в коем случае не гарантируется, что любой другой поток когда-либо увидит его, и что они будут отображаться в том же порядке.

An AtomicReference обеспечивает гораздо более надежные гарантии (помимо операций CAS), по существу они ведут себя как volatile:

  • Любые записи, которые произошли в потоке A, до того, как вольтамплитная запись будет видна в потоке B после последующего волатильного чтения этой переменной
  • изменчивые операции не могут быть переупорядочены