Ale*_*man 9 java concurrency spring scope
Spring bean的singleton/session范围是否要求必须同步对其所有字段的访问?通过"synchronized"关键字或使用包"java.util.concurrent"中的某些类来说.
例如,这段代码不是线程安全的吗?(从这里复制/补充):
@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);
}
}
Run Code Online (Sandbox Code Playgroud)
Jas*_*man 24
当您使用singletonSpring容器中的作用域时,您指示从容器中检索bean的所有线程将使用相同的实例.因此,在这种情况下,项目的状态列表在线程之间共享和修改,您必须同步对列表的访问以保护您的应用程序免受攻击ConcurrentModificationException.
但是,Spring的通常做法是使用无状态对象构建应用程序,这些对象没有在应用程序的整个生命周期中都会发生变化的状态.
在session范围的情况下,您可能不太可能看到并发问题,因为bean只能由当前登录的用户访问.但是,有可能(至少在网络上)在同一个会话中有多个请求,在这种情况下,您需要采取相同的预防措施,就像bean是单例一样.
保护自己的最佳方法是尽量保持你的bean尽可能无状态.如果你有一个需要状态的bean,你应该考虑使用prototypescope,每次从容器中检索bean的一个新实例.
| 归档时间: |
|
| 查看次数: |
10618 次 |
| 最近记录: |