我已经阅读了很多关于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);
}
}
感谢您的帮助。
答案 0 :(得分:3)
您还没有在getNameViaParameter
方法中显示任何影响servlet中任何共享状态的内容,因此它应该没问题。您不会在不同的线程中多次调用相同的请求,因此只要您的方法仅使用该请求,就可以了。
如果你不需要在其他servlet中覆盖它,你可以通过使方法保持静态来更清楚。
答案 1 :(得分:0)
从给定代码开始,它是线程安全的,因为局部变量是线程安全的。但是如果你使用的是实例变量,那么很可能会改变它的状态。然后你需要处理同步。