AtomicReferenceFieldUpdater - методы set, get, семантика compareAndSet

Из документации Java AtomicReferenceFieldUpdater:

Обратите внимание, что гарантии метода compareAndSet в этом классе слабее, чем в других атомарных классах. слабее, чем в других классах атомов. Поскольку этот класс не может гарантировать что все использования поля подходят для целей атомарного доступа, он может гарантировать атомарность и волатильную семантику только в отношении относительно других вызовов compareAndSet и set.

Это означает, что я не могу выполнять обычную волатильную запись вместе с compareAndSet, а должен использовать set вместо этого. Здесь ничего не говорится о get.

Значит ли это, что я все еще могу читать волатильные поля с теми же гарантиями атомарности - все записи до set или compareAndSet видны всем, кто читал волатильное поле?

Или я должен использовать get на AtomicReferenceFieldUpdater вместо волатильных чтений поля?

Пожалуйста, опубликуйте ссылки, если они у вас есть.

Спасибо.

EDIT:

Из Java Concurrency in Practice, единственное, что они говорят:

Гарантии атомарности для классов updater слабее, чем для обычных атомарных классов, потому что вы не можете гарантировать, что базовые поля не будут изменены напрямую - методы compareAndSet и арифметические методы гарантируют атомарность только по отношению к другим потоков, использующих методы обновления атомарных полей.

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

Также, правильно ли я понимаю, что "изменено напрямую" - это обычная запись в переменные?

28
задан Quuxplusone 14 March 2014 в 17:59
поделиться

1 ответ

Это означает, что ссылка на объект будет гарантирована, но поскольку вы можете использовать любой объект, поля этого объекта могут быть неправильно записаны, когда другой поток отправляется для доступа к объекту.

Единственный способ, который может быть гарантирован, это если поля были окончательными или изменчивыми.

2
ответ дан 28 November 2019 в 03:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: