当前位置: 首页 > 知识库问答 >
问题:

抽象servlet--这个方法是线程安全的吗?

邢冷勋
2023-03-14

我读过很多关于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);
    }

}

共有1个答案

潘修为
2023-03-14

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是其子类型) ”如果存在打开的语