Java EE bean 和 volatile 关键字

Java EE beans and volatile keyword

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

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

注释的字段

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

对于 EJB,容器已经实施了一些默认的并发控制,您可以通过 @Lock@ConcurrencyManagement 注释进行控制。另见 a.o。 .

对于 JPA 实体,对并发控制的任何需求都表明存在一个主要的 design/fundamental 问题。并发控制只应在控制器中实施,而不应在模型或视图中实施。 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 ("singletons" in widest sense), it may make sense, but only if there doesn't already exist a concurrent/atomic wrapper class for the field of interest, such as ConcurrentMap, AtomicBoolean, etcetera. See also a.o. .