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