2016-06-23 2 views
1

@Singleton으로 표시된 클래스가 있습니다. ,beanManager.getReference()는 쓰레드에 안전한가요?

public Object getMySingleton(Class someClass){ 
    Bean bean = (Bean) beanManager.getBeans(someClass).iterator().next(); 
    CreationalContext ctx = beanManager.createCreationalContext(bean); 
    Object obj =beanManager.getReference(bean, someClass, ctx); 
    return obj; 
} 

하십시오 getMySingleton이 synchronized이 아니라고주의 :

내가 다음 코드를 사용하는 클래스의 인스턴스를 얻으려면. 이 코드는 스레드로부터 안전합니까? 내 말은, getMySingleton은 다른 스레드에서 호출 할 수 있습니다 - 모든 호출자에서 Singleton의 동일한 인스턴스를 가져올 수 있습니까?

javaee 서버로 저는 glassfish를 사용하고 cdi 컨테이너로 용접합니다. 그러나 java-ee 스펙에 따라 일반적인 대답을 얻고 싶습니다.

답변

1

예, 그렇습니다.

실제로 getReference()proxy 인스턴스를 반환하고, 실제로 인스턴스에 위임합니다. 그것은 대략 가상의 SomeBean 클래스에 대해 다음과 같습니다

public SomeBeanCDIProxy extends SomeBean implements Serializable { 

    public String getSomeProperty() { 
     SomeBean instance = CDI.resolveItSomehow(); 
     return instance.getSomeProperty(); 
    } 

    public void setSomeProperty(String someProperty) { 
     SomeBean instance = CDI.resolveItSomehow(); 
     instance.setSomeProperty(someProperty); 
    } 

} 

실제 인스턴스가 반드시 프록시 인스턴스를 생성하고 반환되는 순간에 생성 할 수 없습니다. 프록시에서 Bean 메소드 중 하나를 호출하고 실제 인스턴스를 해당 범위에서 사용할 수없는 경우에만 CDI는 실제 인스턴스를 작성하고 메소드 호출을 위임합니다. 프록시 (수동 또는 주입)를 얻는 방법에 관계없이 실제 인스턴스는 논리적으로 스레드 안전 방식으로 작성됩니다. 그렇지 않으면 주입을 위해서도 효과가 없을 것입니다.

관련 문제