Если мы посмотрим на Safe Publication Шипилева, один из тривиальных способов получить безопасную публикацию - это работать:
Обмен ссылками через изменчивое поле (JLS 17.4.5) или как следствие этого правила, через классы AtomicX
Поскольку CompletableFuture
использует поле volatile
для записи и чтения значения, для безопасной публикации не требуется никаких дополнительных барьеров памяти.Это объясняется в CompletableFuture
комментарии к обзору классов :
* A CompletableFuture may have dependent completion actions,
* collected in a linked stack. It atomically completes by CASing
* a result field, and then pops off and runs those actions. This
* applies across normal vs exceptional outcomes, sync vs async
* actions, binary triggers, and various forms of completions.
*
* Non-nullness of volatile field "result" indicates done. It may
* be set directly if known to be thread-confined, else via CAS.
* An AltResult is used to box null as a result, as well as to
* hold exceptions.
Он также обрабатывает безопасную инициализацию опубликованных объектов, как в том же обзоре позже:
* Completion fields need not be declared as final or volatile
* because they are only visible to other threads upon safe
* publication.