Java Guice单例和Servlet
我在用Guice,我有个问题。有一个servlet是单例的。JVM中只有一个此类实例,还是只有一个会话范围实例?那么对这个类的并发访问呢?对servlet资源的并发访问会有任何问题。Servlet容器将很好地处理它,它将在eaach请求中生成新线程,并传递将要处理的Servlet引用和请求Java Guice单例和Servlet,java,servlets,singleton,guice,Java,Servlets,Singleton,Guice,我在用Guice,我有个问题。有一个servlet是单例的。JVM中只有一个此类实例,还是只有一个会话范围实例?那么对这个类的并发访问呢?对servlet资源的并发访问会有任何问题。Servlet容器将很好地处理它,它将在eaach请求中生成新线程,并传递将要处理的Servlet引用和请求 让servlet成为单线程的好方法是确认单个内存空间的使用,所以容器将是轻量级的。在spring中也有相同的概念,默认情况下每个bean都是单例的 我不确定Guice,但Container确保按照规范,DD中
让servlet成为单线程的好方法是确认单个内存空间的使用,所以容器将是轻量级的。在spring中也有相同的概念,默认情况下每个bean都是单例的 我不确定Guice,但Container确保按照规范,DD中的每个定义,每个JVM只存在一个Servlet实例,除非您的Servlet实现了邪恶的
SingleThreadModel
。容器将调用服务()
方法,为每个请求生成一个新线程
此外,类和实例变量将不是线程安全的。只有局部变量才是线程安全的。实际上,Guice需要servlets来管理单例:
注意:每个servlet(或过滤器)都必须是@Singleton。如果不能直接注释该类,则必须使用bind(..).in(Singleton.class)将其绑定到filter()或servlet()规则。任何其他作用域下的映射都是错误的。这是为了保持与Servlet规范的一致性。Guice Servlet不支持不推荐使用的SingleThreadModel
(来自)
您负责正确处理并发访问。我将如何处理并发访问?这取决于您的应用程序。该框架将允许多个请求同时访问servlet。您需要确保servlet所做的是安全的。我建议阅读Brian Goetz的Practic中的Java并发,以获得一个良好的概述。