Spring bean 的单例/会话范围是否要求对其所有字段的访问必须同步?通过“synchronized”关键字或使用“java.util.concurrent”包中的一些类来表示。
例如,这段代码不是线程安全的吗? (复制/粘贴自here http://vraptor.caelum.com.br/documentation/vraptor3-ten-minutes-guide/):
@Component
@SessionScoped
public class ShoppingCart {
private List<Product> items = new ArrayList<Product>();
public List<Product> getAllItems() {
return items;
}
public void addItem(Product item) {
items.add(item);
}
}
当你使用singleton
从 Spring 容器的范围来看,您指示从容器检索 bean 的所有线程都将使用相同的实例。因此,在这种情况下,项目的状态列表在线程之间共享且可修改,您必须同步对列表的访问,以保护您的应用程序免受ConcurrentModificationException
.
然而,Spring 的通常做法是使用无状态对象构建应用程序,这些对象的状态不会在应用程序的整个生命周期中发生变化。
如果是session
在范围内,您可能不太可能看到并发问题,因为该 bean 只能由当前登录的用户访问。但是,(至少在 Web 上)可能会在同一个会话中收到多个请求,在这种情况下,您需要采取与单例 Bean 相同的预防措施。
同样,保护自己的最佳方法是尽量使您的 bean 保持无状态。如果您有一个需要状态的 bean,您应该考虑使用prototype
范围,每次从容器中检索 bean 的新实例。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)