非servlet类的实例变量是否是线程安全的?

时间:2017-01-03 12:10:32

标签: java servlets thread-safety

非servlet类的实例变量是否是线程安全的,如果在servlet方法中实例化,如下所示?

//Non-servlet Class
public class x{

  public String var1;
  public String var2;

  public String method(){
   return (var1 + var2);
  }
}

Servlet类

public class myServlet extends HttpServlet {
   protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
      String varA = "Hello ";
      String varB = "World";
      String varC = null;
      x xx = new x();
      xx.var1 = varA;
      xx.var2 = varB;
      varC = xx.method();
   }
}

2 个答案:

答案 0 :(得分:1)

  

非servlet类的实例变量是否是线程安全的?

在您的情况下,它不是实例变量,而是doGet()方法执行范围内的语言环境变量。

 protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
     ...
     x xx = new x();
     ...
    }

在方法中声明和使用的语言环境变量在多个线程的调用之间是隔离的。所以你在这里没有潜在的并发性。

如果xx变量是一个实例变量,那么你就会遇到竞争条件,因为如果在一个接近的时间内多次调用servlet,多个线程可以以并发方式访问它们。

 public class myServlet extends HttpServlet {
     x xx = new x();
     ...
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
     ...
     xx.doSomething(); // concurrency race 
     xx.var1 = varA;   // concurrency race 
     ...
    }

答案 1 :(得分:1)

每次拨打new x()时,您都会创建一个newx的独立实例。这意味着每个帖子都有自己的副本,没有任何内容可以共享,所以你不要# 39;不得不担心线程安全。