有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java抽象Servlet此方法是线程安全的吗?

我读过很多关于Servlet和threadsafe的书,我知道“Servlet容器只加载和实例化每个Servlet一次…”。但若我创建了一个抽象类extensdservlet,它有一个使用参数处理的方法,那个么在后代中使用这个线程安全吗

我知道,“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) 个答案

  1. # 1 楼答案

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

    假设不需要在其他servlet中重写该方法,则可以通过将该方法设置为静态来更清楚地说明这一点

  2. # 2 楼答案

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