Из документации Java AtomicReferenceFieldUpdater
:
Обратите внимание, что гарантии метода
compareAndSet
в этом классе слабее, чем в других атомарных классах. слабее, чем в других классах атомов. Поскольку этот класс не может гарантировать что все использования поля подходят для целей атомарного доступа, он может гарантировать атомарность и волатильную семантику только в отношении относительно других вызововcompareAndSet
иset
.
Это означает, что я не могу выполнять обычную волатильную запись вместе с compareAndSet
, а должен использовать set
вместо этого. Здесь ничего не говорится о get
.
Значит ли это, что я все еще могу читать волатильные поля с теми же гарантиями атомарности - все записи до set
или compareAndSet
видны всем, кто читал волатильное поле?
Или я должен использовать get
на AtomicReferenceFieldUpdater
вместо волатильных чтений поля?
Пожалуйста, опубликуйте ссылки, если они у вас есть.
Спасибо.
EDIT:
Из Java Concurrency in Practice, единственное, что они говорят:
Гарантии атомарности для классов updater слабее, чем для обычных атомарных классов, потому что вы не можете гарантировать, что базовые поля не будут изменены напрямую - методы compareAndSet и арифметические методы гарантируют атомарность только по отношению к другим потоков, использующих методы обновления атомарных полей.
Опять же, не упоминается, как другие потоки должны читать эти изменчивые поля.
Также, правильно ли я понимаю, что "изменено напрямую" - это обычная запись в переменные?
Это означает, что ссылка на объект будет гарантирована, но поскольку вы можете использовать любой объект, поля этого объекта могут быть неправильно записаны, когда другой поток отправляется для доступа к объекту.
Единственный способ, который может быть гарантирован, это если поля были окончательными или изменчивыми.