2016-06-23 3 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, я использую стеклянную рыбку и свариваю как контейнер 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); 
    } 

} 

Фактический экземпляр не обязательно создан и доступен в данный момент прокси экземпляр создается и возвращается. Только когда вы вызываете один из методов компонента в прокси-сервере, и фактический экземпляр недоступен в своей области, тогда CDI создаст фактический экземпляр и делегирует вызов метода ему. Независимо от способа получения прокси (вручную или впрыска), фактический экземпляр логически создается безопасным потоком. В противном случае это также не сработало бы для инъекций.

Смежные вопросы