我正在使用 Guice,我有一个问题。有一个 servlet 是 Singleton。JVM 中只有一个此类的实例还是只有一个 Session 范围的实例?那么对这个类的并发访问呢?
3 回答
实际上,Guice需要它管理为单例的 servlet:
注意:每个 servlet(或过滤器)都必须是 @Singleton。如果不能直接注释类,则必须使用 bind(..).in(Singleton.class) 绑定它,与 filter() 或 servlet() 规则分开。在任何其他范围内映射都是错误的。这是为了保持与 Servlet 规范的一致性。Guice Servlet 不支持已弃用的 SingleThreadModel。
(来自本文档)
您有责任正确处理并发访问。
您的 servlet 资源的并发访问会有任何问题。Servlet 容器会很好地处理它,它将在每个请求中生成新线程并传递该 servlet 引用,并且请求将被处理。
最好让你的servlet单线程确认单个内存空间的使用,所以容器将是轻量级的。在 spring 中可以使用相同的概念,默认情况下每个 bean 都是单例的。
我不确定 Guice,但 Container 确保每个 JVM 每个 DD 中的定义只存在一个 Servlet 实例,按照规范,除非您的 Servlet 实现邪恶SingleThreadModel
。Container 将为每个request
调用service()
方法生成一个新线程。
此外,类和实例变量将不是线程安全的。只有局部变量是线程安全的。