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);
}
}
谢谢你的帮助
# 1 楼答案
在
getNameViaParameter
方法中没有显示任何影响servlet中任何共享状态的内容,因此应该可以。您不会在不同的线程中对同一个请求进行多次调用,因此只要您的方法只使用该请求,就可以了假设不需要在其他servlet中重写该方法,则可以通过将该方法设置为静态来更清楚地说明这一点
# 2 楼答案
从给定的代码来看,它是线程安全的,因为局部变量是线程安全的。但是,如果您使用的是实例变量,那么它很可能会更改其状态。然后您需要处理同步