gpt4 book ai didi

jakarta-ee - Java EE bean 和 volatile 关键字

转载 作者:行者123 更新时间:2023-12-04 02:23:36 25 4
gpt4 key购买 nike

Java EE 规范的 Servlet、EJB 和 CDI 部分描述了 bean 管理(注入(inject)等)。但规范也没有(明确或隐含地)描述 bean 容器的并发属性。如果我使用过 WildFly 或 GlassFish,那么 Java EE 应用服务器可以从一个线程更多地访问 bean 对象。

所以问题是,我是否必须对所有 bean 字段使用 volatile 关键字,理论上可以从多个线程访问这些字段(即对于几乎所有 bean,至少对于所有用 @Inject)?

注释的字段

最佳答案

技术答案取决于 bean 的种类和属性的种类,但通常您根本不需要担心这一点。

在 EJB 的情况下,容器已经实现了一些默认的并发控制,您可以通过 @Lock@ConcurrencyManagement 注释进行控制。另见 a.o. EJB @Asynchronous to retrieve real time inserted row in JSF seems to be thread locked .

对于 JPA 实体,对并发控制的任何需求都表明存在主要的设计/基本问题。并发控制只应在 Controller 中实现,而不应在模型或 View 中实现。 JPA 实体本身绝不代表“ Controller ”。换句话说,JPA 实体中的 volatile 字段没有任何意义,而引用 JPA 实体本身的托管 bean 中的 volatile 字段可能有意义。

在托管 bean (JSF/CDI) 的情况下,通常如果您担心某些托管 bean 上的并发性,则 bean 的范围很可能是错误的并且需要缩小范围。例如。使用 @ViewScoped@ConversationScoped 而不是 @SessionScoped 甚至 @ApplicationScoped。另见 a.o. How to choose the right bean scope?

在应用范围 bean(“单例”in widest sense)的情况下,它可能有意义,但前提是感兴趣的领域尚不存在并发/原子包装类,例如 ConcurrentMap AtomicBoolean 等等。另见 a.o. Concurrency of @ApplicationScoped JSF managed beans .

关于jakarta-ee - Java EE bean 和 volatile 关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35589560/

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