我想将文件系统结构保存在应用程序范围 Bean 中,因为这对所有客户端都有效。 每个客户端都可以读取此 bean。
但是数据每天必须刷新4次,因为文件系统可能会改变。
是否可以为此用例使用应用程序范围的 bean,或者刷新数据时是否存在线程安全问题? 另一种方法是什么?单例?
最佳答案
JSF 或 CDI 作用域注释将为您做的就是控制对象的生命周期。也就是说,当第一次引用它时,bean 将被实例化,并执行任何注入(inject)或构造后方法。在 ApplicationScoped 的情况下,它还将确保只生成该对象的一份副本(当然除非您显式创建一个副本)。
话虽如此,您的类的实例与非容器管理的类的实例没有什么不同,因为它与线程安全相关。因此,如果您更改对象的属性,而其他线程假设它们是一致的,则会遇到问题。 IMO 这是同步访问的问题。任何需要原子性并且具有一致的对象 View 的操作都应该采用某种形式的排他锁。
来自 JavaBeans 规范的一些支持 -
2.8 Multi-Threading Java Beans should assume that they are running in a multi-threaded environment and that several different threads may be simultaneously delivering events and/or calling methods and/or setting properties. It is the responsibility of each java bean developer to make sure that their bean behaves properly under multi-threaded access. For simple beans this can generally be handled by simply making all the methods “synchronized”
关于jsf-2 - 应用程序范围 Bean 的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19402437/