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. .
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.