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