Spring:Singleton/session范围和并发

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的一个新实例.