Параллелизм управляемых bean-компонентов @ApplicationScoped JSF
Я использую Mojarra 2.2.12 и в нашем проекте у нас есть несколько @ApplicationScoped
фасоль. Например:
@ManagedBean
@ApplicationScoped
public class AppScopedBean{
private int commonValueForClients;
//GET, SET
public void evalNew(){
int newCommonVal;
//Evaluation of the new value, doesn't depend on the commonValueForClients
commonValueForClients = newCommonVal;
}
}
Мой вопрос: стоит ли беспокоиться о видимости нового назначенного значения?
Я не смог найти в спецификации, что инфраструктура JSF должна синхронизировать доступ к @ApplicationScoped
бобовые поля. Так что, особенно для Мохарры 2.2.12, мы должны объявить поле как volatile
или синхронизировать доступ к нему явно?
1 ответ
JSF не синхронизирует доступ к управляемым bean-компонентам в любой области.
Это ваша ответственность. Использовать существующие оболочки параллелизма / синхронизации в качестве типов полей, таких как AtomicInteger
, ConcurrentHashMap
, Collections#synchronizedList()
и т. д. Используйте volatile
только в крайнем случае, если такой обертки не существует.
Синхронизация изменяемых объектов определенно необходима в bean-объектах, определяемых приложением. В случае, например, HashMap
в противном случае вы можете даже рискнуть застрять поток (100% ЦП). Это менее строго необходимо в сессионных компонентах, так как к ним будет доступ одновременно, только когда конечный пользователь открывает несколько HTTP-соединений в одном сеансе, и это будет по умолчанию, только когда два физически различных экземпляра браузера порождаются, но они, в свою очередь, по умолчанию уже не поделиться сессией. Так что это может произойти только в случае роботов / хакеров, и поэтому настоятельно рекомендуется позаботиться об этом и в bean-объектах сессионной области. Это почти не нужно с точки зрения области видимости bean-объектов, так как запросы ajax по спецификации поставлены в очередь, но в PrimeFaces их можно отключить <p:ajax async="true">
и вы должны принять это во внимание и в bean-объекте видимости. Это совершенно не нужно в запросе bean-компонентов.
В случае, если у вас есть CDI под рукой, вы также можете имитировать EJB @Lock
аннотация с пользовательской аннотацией и перехватчиком CDI. Это подробно описано в блоге Стефана Кинтелиуса: Управление параллелизмом для CDI, по совпадению размещенного за день до вашего вопроса. Имейте в виду, что средство управления bean-компонентами JSF согласно JSF 2.3 устарело в пользу CDI. См. Также Бэк-бины (@ManagedBean) или CDI-бины (@Named)? Если вы можете, перейдите к CDI для управления бобами.