Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Guice单例和Servlet_Java_Servlets_Singleton_Guice - Fatal编程技术网

Java Guice单例和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中

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

对servlet资源的并发访问会有任何问题。Servlet容器将很好地处理它,它将在eaach请求中生成新线程,并传递将要处理的Servlet引用和请求


让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并发,以获得一个良好的概述。