St.*_*rio 5 concurrency jsf jsf-2 managed-bean application-scope
我正在使用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;
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题是我们应该担心新指定值的可见性吗?
我在规范中找不到JSF基础结构必须同步访问@ApplicationScopedbean字段.因此,特别是对于Mojarra 2.2.12,我们应该将字段声明为volatile或明确地同步对它的访问吗?
JSF并没有同步在任何范围内,以托管bean的任何访问.
那是你的责任.使用现有的并发/同步包装作为字段类型,如AtomicInteger,ConcurrentHashMap,Collections#synchronizedList(),等使用volatile,如果没有这样的包装存在只能作为最后的手段.
在应用程序范围的bean中,可变对象的同步肯定是必需的.在例如情况下HashMap,您甚至可能会遇到卡住线程(100%CPU)的风险.会话范围bean中不太严格必要,因为只有当最终用户在同一会话中打开多个HTTP连接时才会同时访问它们,默认情况下,这只会在生成两个物理上不同的浏览器实例时发生,但它们将依次通过默认已经不共享会话.所以它只会发生在机器人/黑客的情况下,因此仍然强烈建议在会话范围的bean中处理这个问题.在视图范围内的bean几乎没有必要,因为ajax请求是按规范排队的,但在PrimeFaces中它可以被关闭<p:ajax async="true">,你也必须在视图范围的bean中考虑它.在请求范围的bean中完全没有必要.
如果您碰巧手头有CDI,您可以选择@Lock使用自定义注释和CDI拦截器来模仿EJB的 注释.这在Stephan Kintelius的博客中有详细说明:CDI的并发控制,恰好在你的问题前一天发布.请记住,JSF bean管理工具是根据JSF 2.3而不赞成使用CDI.另请参阅Backing beans(@ManagedBean)或CDI Beans(@Named)?如果可以,请转到CDI进行bean管理.
| 归档时间: |
|
| 查看次数: |
1546 次 |
| 最近记录: |