Abstract Servlet - 这个方法线程安全吗?

时间:2014-05-02 12:27:37

标签: java multithreading servlets thread-safety abstract-class

我已经阅读了很多关于servlet和线程安全的内容 - 我知道," Servlet容器只加载并实例化每个Servlet一次......"。但是如果我创建抽象类扩展Servlet,它有一个用参数处理的方法,这个线程是否可以在后代中使用呢?

我知道," HttpServletRequests和HttpServletResponses不在不同的线程之间共享,因此我不需要同步它们的读写访问权限......"

public abstract class AbstractService extends HttpServlet {

    protected String getNameViaParameter(HttpServletRequest httpServletRequest){
        String name         = null;
        String nameViaParam = httpServletRequest.getParameter("name"); 
        if ((nameViaParam != null) && (!nameViaParam.isEmpty())){
            name = nameViaParam;
            // ... process with name...
     }
     // return
     return name;
    }
}

并指定Servlet:

public class Service extends AbstractService {

     protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
        // is this thread-safe ???
        String name = getNameViaParameter(req);
        doSomething(name);
    }

}

感谢您的帮助。

2 个答案:

答案 0 :(得分:3)

您还没有在getNameViaParameter方法中显示任何影响servlet中任何共享状态的内容,因此它应该没问题。您不会在不同的线程中多次调用相同的请求,因此只要您的方法仅使用该请求,就可以了。

如果你不需要在其他servlet中覆盖它,你可以通过使方法保持静态来更清楚。

答案 1 :(得分:0)

从给定代码开始,它是线程安全的,因为局部变量是线程安全的。但是如果你使用的是实例变量,那么很可能会改变它的状态。然后你需要处理同步。