我最近一直在阅读关于安全发布Java对象的文章(例如:http://shipilev.net/blog/2014/safe-public-construction/)。
到目前为止,当我依赖容器管理的并发性时,我是毫无疑问地信任EJB容器。
现在我想知道1) EJB容器如何确保EJB本身被安全发布? 2) EJB容器如何确保由其EJB创建的对象被安全发布(例如EJB实例变量)?
例如,随着时间的推移,无状态会话bean可能会被不同的线程访问(我不是一定要同时说),所以不安全的发布是一个潜在的问题。
对于1),我粗略地看到了一些可能性,例如,通过包装EJB和使用一些易失性访问来保证总顺序。
对于2),我不明白EJB容器如何执行它。也许EJB3.1规范禁止在EJB中保留实例变量,如果它可以被不同的线程访问的话?也许“不要担心容器管理的EJB中的并发性”这句话是不正确的,我应该在EJB实例变量中使用的类的类定义中使用安全发布模式(包括volatile和/或final关键字)?
作为一名Java开发人员,我错过了这个基本问题这么多年,这让我很惊讶。
致敬,拉尔斯
发布于 2015-09-25 03:44:33
如果EJB容器正在重用实例,它必须将它们存储在线程安全的对象池中,该对象池必须使用某种同步(synchronized
、比较和交换等),这将确保第一个线程写入的所有内容都将“发生在”第二个线程上发生的所有事情之前。EJB开发人员不需要担心同步(除非他们使用具有bean管理的并发的单例会话bean,或者EJB通过将数据存储在静态变量中而超出了EJB规范的范围)。
https://stackoverflow.com/questions/32763428
复制相似问题