我读过很多关于Servlet和threadsafe的文章--我知道,“Servlet容器只加载和实例化每个Servlet一次……”。但是,如果我创建抽象类extends Servlet,它有一个用参数处理的方法,那么在后代中使用这个threadsafe吗?
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;
}
}
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);
}
}
在getNameViaparameter
方法中没有显示任何影响servlet中任何共享状态的内容,因此应该没有问题。您最终不会在不同的线程中对同一请求进行多个调用,因此只要您的方法只使用该请求,就可以了。
假设不需要在其他servlet中重写该方法,您可以通过使该方法静态化来使这一点更加清楚。
IBM的支持指出,Class.GetAnnotation的实现不是线程安全的。 与其他JVM实现(例如,OpenJDK)相比,我们可以看到它们以线程安全的方式实现类方法。IBM JVM是一个闭源JVM,他们确实会发布一些源代码和他们的JVM一起,但无论什么时候他们的类实现是否线程安全,都不足以做出明确的判断。 类文档没有清楚地说明它的方法何时是线程安全的。那么,将类方法(特别是getAnnotat
看起来它工作得很好,但我想知道我是否必须确保新代码需要线程安全?这里有什么意见吗?抱歉用了假名字,提前致谢。
例如,以下方法: 我关心的是如果我有多个线程调用。对象是否可能被另一个线程覆盖?换句话说,Thread 1调用并获取返回的
问题内容: Spring对象是线程安全的吗?如果没有,如何使它们线程安全? 问题答案: 这是两个不相关的问题: spring线程安全吗? 没有。 Spring具有不同的bean 作用域(例如Prototype,Singleton等),但是所有这些作用域都是在创建bean 时强制执行的。例如,每次“注入”一个“原型”范围的bean都会被创建,而一个“单个”范围的bean将被创建一次并在应用程序上下文
问题内容: servlet是线程安全的吗?例如,如果我打开5个不同的浏览器并向容器中的一个servlet发送请求,它是否仍然是线程安全的,我特别指的是方法 问题答案: 您的问题可以归结为: 正在从同一对象线程safe上的多个线程调用方法 。答案是: 取决于 。如果您的对象(让它成为servlet)是无状态的或仅具有字段,则这是完全线程安全的。局部变量和参数是线程局部的(驻留在堆栈上,而不是堆上)。
问题内容: 我有多个线程试图更新MySQL数据库?使用executeUpdate方法是线程安全的吗? 问题答案: 不,使用它不是线程安全的。 实际上,如果其他某个线程使用一条语句,然后另一个线程调用executeUpdate(),则另一个线程的s(如果有的话)将被关闭。“ javadoc.sql.Statement的JavaDoc(PreparedStatement是其子类型) ”如果存在打开的语