Используя подход после конструирования, когда мы хотим условно инициализировать некоторые поля бина, нужно ли нам заботиться о волатильности поля, поскольку это многопоточная среда?
Скажем, у нас есть что-то вроде этого:
@ApplicationScoped
public class FooService {
private final ConfigurationService configurationService;
private FooBean fooBean;
@Inject
FooService(ConfigurationService configurationService) {
this.configurationService = configurationService;
}
void init(@Observes @Initialized(ApplicationScoped.class) Object ignored) {
if (configurationService.isFooBeanInitialisationEnabled()) {
fooBean = initialiseFooBean(configurationService); // some initialisation
}
}
void cleanup(@Observes @Destroyed(ApplicationScoped.class) Object ignored) {
if (fooBean != null) {
fooBean.cleanup();
}
}
}
Значит, fooBean
должен быть заключен, скажем, в AtomicReference
или быть volatile
, или это будет избыточная дополнительная защита?
P.S. В данном конкретном случае его можно переформулировать следующим образом: выполняются ли события после пост-конструкции и после уничтожения одним и тем же потоком или нет? Однако я хотел бы получить ответ для более общего случая.