Java EE bean 和 volatile 关键字

Mar*_*rov 3 ejb volatile javabeans cdi jakarta-ee

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

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

Bal*_*usC 5

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

在EJB的情况下,容器已经强制执行了一些默认的并发控制,你可以通过控制@Lock@ConcurrencyManagement注释。另请参阅 ao EJB @Asynchronous 以在 JSF 中检索实时插入的行似乎是线程锁定的

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

对于托管 bean (JSF/CDI),通常如果您担心某个托管 bean 的并发性,则 bean 的范围很可能是错误的,需要缩小范围。例如,使用@ViewScopedor@ConversationScoped代替@SessionScoped甚至@ApplicationScoped。另见 ao如何选择合适的 bean 作用域?

在应用范围的Bean(“单身”的情况下,在最广泛的意义),它可能是有意义的,但前提已不存在并发/原子包装类感兴趣的领域,如ConcurrentMapAtomicBoolean,等等。另请参见@ApplicationScoped JSF 托管 bean 的并发