Java servlet范围

时间:2012-01-26 20:07:54

标签: java servlets

我有一个Web应用程序,它有Servlet和通过getInstance访问的静态类:

MyServlet extends HttpServet {
 protected void doGet(...) {
  MyClass.getInstance().doStuff();
 }
}

当客户端连接到servlet时,他们是否获得了自己的MyClass,或者这个类的实例对所有servlet都是全局的?我的意思是说它有一个在doGet方法中设置的静态变量,当其他clietns访问Web应用程序时,它们是否会获得此静态类中其他客户端设置的变量的值?

编辑:

具体来说,MyClass表示访问Web服务的类,即经过身份验证的类。

3 个答案:

答案 0 :(得分:2)

是的,在类加载器中共享static字段值。因此,如果MyClass.getInstance()返回static MyClass字段,则所有调用都会共享该字段。

请注意,只有一个servlet实例,多个线程通过其doGet(..)方法。

如果您需要进行一些初始化,您有两个选择:.getInstance()或servlet的init()方法。

答案 1 :(得分:2)

您的Web应用程序中的所有代码都可以访问MyClass的相同静态变量。

但是,它仍然受Java线程模型规则的约束。

因此,在没有同步的情况下,在doGet中更改它并不意味着其他线程会自动看到新值。

答案 2 :(得分:1)

取决于MyClass的实现。如果它是一个单例,那么它只是doStuff所需的所有“实例化”的一个实例。

分享其代码,人们会帮助您。