【发布时间】:2015-08-27 07:57:18
【问题描述】:
这可能是一个非常简单的问题,但我并不完全清楚。
我有一个豆子如下:
@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(请求/会话/视图等)中。现在他们都访问了这个 Foos 列表。我的问题是,当另一个 bean 可能调用 modifyFoos() 时,按原样返回列表是否安全。或者这是永远不会发生并且由容器保证的事情?
我已经阅读了有关容器管理事务等的一些文档,但尚不完全清楚它在这种情况下是如何工作的。例如,用并发容器替换列表是否更好?
【问题讨论】:
-
如果您不希望您的列表数据被其他类更改,您应该返回一个副本而不是原始列表的引用。
-
@sgplait,大多数情况下我返回
Stream<>()- 我在示例中使用List<>,因为它更通用......但同样的问题适用......(AFAIK,流- 除非由并发容器支持,否则不是线程安全的。!?!)