@Singleton bean return 应该是内部 List<> 成员吗?

Should a @Singleton bean return an internal List<> member?

这可能是一个非常简单的问题,但我不是很清楚。

我有一个bean如下:

@Singleton
@Startup
@Lock(READ)
public class SomeDataBean {
  List<Foo> foos;

  @PostConstruct
  public void init() {
    // Build foos;
  }

  public List<Foo> getFoos() {
    return foos;
  }

  @Lock(WRITE)
  public void modifyFoos() {
    // This could be potentially called too
  }
}

随后,这个 bean 被注入(使用 CDI - 环境是 Wildfly 8.2),进入各种其他 bean(Request/Session/View 等)现在他们都访问这个 Foos 的列表。我的问题是,当 modifyFoos() 可能被另一个 bean 调用时,按原样 return 列表是否安全。或者这是永远不会发生并且由容器保证的事情?

我已经阅读了一些关于容器管理事务等的文档,但并不完全清楚它在这种情况下是如何工作的。例如,用并发容器替换列表是否更好?

不,这不安全,因为一个线程可以读取列表,而另一个线程可以修改它。

  1. Return 列表的副本(如果有很多读取则效率不高)。
  2. 使用copy-on-write列表。
  3. modifyFoos 中存储列表的新实例。