CDI PostConstruct의 휘발성 필드

Andremoniy :

조건부 빈의 일부 필드 초기화, 우리는 필드의 변동성에 대해 신경 쓸 필요가해야 할 우리가 멀티 쓰레드 환경이기 때문에, 할 때 포스트 구조 방법을 사용하십니까?

말, 우리는 다음과 같이 있습니다 :

@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하거나 중복 추가 보호 할 것인가?

PS 가로 공식화 할 수있는이 특별한 경우는 : 포스트 구조 및 사후 파괴 이벤트가 동일한 스레드에 의해 수행 여부입니까? 그러나 나는 더 일반적인 경우에 대한 대답을하고 싶습니다.

니콜라 Henneaux :

나는 스레드가 실제로 시작과 맥락을 파괴하는이 달려 말할 것입니다. 당신이 정기적으로 이벤트를 사용하는 경우, 그들은 (비동기 이벤트와 CDI 2.0에 추가 된 동기이다 ObservesAsync, 참조 : ManagedExecutorService 비동기 CDI 2.0 이벤트를 보내는 자바 EE 8 그들은 호출자와 동일한 스레드에서 호출되도록).

일반적으로, 내가 사용하는 것이 좋습니다 것입니다 그래서 같은 스레드 (응용 프로그램 서버 또는 독립 실행 형 응용 프로그램에서) 사용 생각하지 않습니다 volatile올바른 값을 볼 수 있도록 (기본적으로 값은 스레드를 파괴 볼하여 구성). 그러나, 그것은 시작과 동시 방법으로 응용 프로그램을 파괴하는 너무 많은 일이 일어나고 유스 케이스는 아니지만 ...

추천

출처http://43.154.161.224:23101/article/api/json?id=118824&siteId=1