【发布时间】:2019-04-13 03:11:31
【问题描述】:
当我们想要有条件地初始化 bean 的某些字段时使用后构造方法,我们是否需要关心字段的波动性,因为它是一个多线程环境?
说,我们有这样的事情:
@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. 在这种特殊情况下,它可以重新表述为:构建后事件和销毁后事件是否由同一个线程执行?但是,我想为更一般的情况提供答案。
【问题讨论】:
标签: java jakarta-ee concurrency cdi volatile