@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 等)现在他们都访问这个 Foo
s 的列表。我的问题是,当 modifyFoos()
可能被另一个 bean 调用时,按原样 return 列表是否安全。或者这是永远不会发生并且由容器保证的事情?
我已经阅读了一些关于容器管理事务等的文档,但并不完全清楚它在这种情况下是如何工作的。例如,用并发容器替换列表是否更好?
不,这不安全,因为一个线程可以读取列表,而另一个线程可以修改它。
- Return 列表的副本(如果有很多读取则效率不高)。
- 使用copy-on-write列表。
- 在
modifyFoos
中存储列表的新实例。
这可能是一个非常简单的问题,但我不是很清楚。
我有一个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 等)现在他们都访问这个 Foo
s 的列表。我的问题是,当 modifyFoos()
可能被另一个 bean 调用时,按原样 return 列表是否安全。或者这是永远不会发生并且由容器保证的事情?
我已经阅读了一些关于容器管理事务等的文档,但并不完全清楚它在这种情况下是如何工作的。例如,用并发容器替换列表是否更好?
不,这不安全,因为一个线程可以读取列表,而另一个线程可以修改它。
- Return 列表的副本(如果有很多读取则效率不高)。
- 使用copy-on-write列表。
- 在
modifyFoos
中存储列表的新实例。