0

我正在使用 Guice,我有一个问题。有一个 servlet 是 Singleton。JVM 中只有一个此类的实例还是只有一个 Session 范围的实例?那么对这个类的并发访问呢?

4

3 回答 3

0

实际上,Guice需要它管理为单例的 servlet:

注意:每个 servlet(或过滤器)都必须是 @Singleton。如果不能直接注释类,则必须使用 bind(..).in(Singleton.class) 绑定它,与 filter() 或 servlet() 规则分开。在任何其他范围内映射都是错误的。这是为了保持与 Servlet 规范的一致性。Guice Servlet 不支持已弃用的 SingleThreadModel。

(来自本文档

您有责任正确处理并发访问。

于 2013-07-11T16:54:27.793 回答
0

您的 servlet 资源的并发访问会有任何问题。Servlet 容器会很好地处理它,它将在每个请求中生成新线程并传递该 servlet 引用,并且请求将被处理。

最好让你的servlet单线程确认单个内存空间的使用,所以容器将是轻量级的。在 spring 中可以使用相同的概念,默认情况下每个 bean 都是单例的。

于 2013-07-11T07:58:05.427 回答
0

我不确定 Guice,但 Container 确保每个 JVM 每个 DD 中的定义只存在一个 Servlet 实例,按照规范,除非您的 Servlet 实现邪恶SingleThreadModel。Container 将为每个request调用service()方法生成一个新线程。

此外,类和实例变量将不是线程安全的。只有局部变量是线程安全的。

于 2013-07-11T07:58:28.837 回答