gpt4 book ai didi

jsf - @ApplicationScoped JSF 托管 bean 的并发性

转载 作者:行者123 更新时间:2023-12-04 13:58:42 24 4
gpt4 key购买 nike

我正在使用 Mojarra 2.2.12,在我们的项目中,我们有一些 @ApplicationScoped bean 。例如:

@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;
}
}

我的问题是我们是否应该担心新分配值的可见性?

我在 the spec 中找不到JSF 基础设施必须同步访问 @ApplicationScoped bean 田。因此,特别是对于 Mojarra 2.2.12,我们是否应该将该字段声明为 volatile或明确同步访问它?

最佳答案

JSF 做 不是 在任何范围内同步对托管 bean 的任何访问。

那是你的责任。使用现有的并发/同步包装器作为字段类型,例如 AtomicInteger , ConcurrentHashMap , Collections#synchronizedList() 等使用 volatile如果不存在这样的包装器,则仅作为最后的手段。

在应用程序范围的 bean 中,可变对象的同步绝对是必要的。在例如的情况下HashMap ,否则您甚至可能冒 stuck thread 的风险(100% CPU)。在 session 作用域 bean 中不太严格需要,因为只有当最终用户在同一个 session 上打开多个 HTTP 连接时它们才会被并发访问,这将 by default仅当产生两个物理上不同的浏览器实例时才会发生,但默认情况下它们将不共享 session 。所以它只会在机器人/黑客的情况下发生,因此仍然强烈建议在 session 范围的 bean 中处理这个问题。在 View 作用域 bean 中几乎没有必要,因为 ajax 请求是 by specification排队,但在 PrimeFaces 中它可以通过 <p:ajax async="true"> 关闭,并且您还必须在 View 范围的 bean 中考虑到这一点。在请求范围的 bean 中完全没有必要。

如果您碰巧手头有 CDI,您也可以选择模仿 EJB 的 @Lock带有自定义注释和 CDI 拦截器的注释。这在 Stephan Kintelius 的博客中有详细说明:Concurrency control for CDI ,巧合的是在您提出问题的前一天发布。请记住,JSF bean 管理工具根据 JSF 2.3 已弃用,以支持 CDI。另见 Backing beans (@ManagedBean) or CDI Beans (@Named)?如果可以,请转到 CDI 以进行 bean 管理。

关于jsf - @ApplicationScoped JSF 托管 bean 的并发性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35009907/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com