我最近一直在阅读有关安全发布Java对象的信息(例如:http://shipilev.net/blog/2014/safe-public-construction/)。
到目前为止,在依赖容器管理的并发时,我信任EJB容器没有问题。
现在我想知道 1)EJB容器如何确保EJB本身安全发布? 2)EJB容器如何确保其EJB创建的对象安全发布(例如EJB实例变量)?
E.g。无状态会话bean可以随着时间的推移被不同的线程访问(我不是必须同时说),所以不安全的发布是一个潜在的问题。
对于1),我粗略地看到了可能性,例如通过包装EJB并使用一些易失性访问来获取garantuee总订单。
对于2),我没有看到EJB容器如何强制执行它。 也许EJB 3.1规范禁止将实例变量保存在EJB中,如果它可以被不同的线程访问? 也许语句“不要担心容器管理的EJB中的并发性”是不正确的,我应该在EJB实例变量中使用的类的类定义中使用安全发布模式(包括volatile和/或final关键字)?
我很惊讶我作为Java开发人员多年来错过了这个基本问题。
此致 拉斯
答案 0 :(得分:0)
如果EJB容器正在重用实例,它必须将它们存储在线程安全的对象池中,该对象池必须使用某些同步(synchronized
,比较和交换等),这将确保一切由第一个帖子写的"发生在"之前在第二个线程上发生的一切。 EJB开发人员不需要担心同步(除非他们通过bean管理的并发使用单例会话bean,或者EJB通过将数据存储在静态变量中而超出EJB规范的范围)。