当前位置: 首页 > 面试题库 >

Spring MVC类必须是线程安全的

宋航
2023-03-14
问题内容

如果你使用Spring MVC的,必须在组件类(@Controller@Service@Repository)是线程安全的吗?

也就是说,如果我中有一个@RequestMapping方法@Controller,是否可以通过多个线程同时针对同一控制器对象调用该方法?


问题答案:

给定

@Controller
public class MyController {
    @RequestMapping(value = "/index")
    public String respond() {
        return "index";
    }
}

Spring将创建的实例MyController。这是因为Spring解析了您的配置,<mvc:annotation-driven>sees
@Controller(类似于@Component)并实例化了带注释的类。因为它也可以看到@RequestMapping,所以会为其生成一个HandlerMapping,请参见此处的文档。

DispatcherServlet接收到的所有HTTP请求都将通过HandlerMapping之前注册的对象调度到该控制器实例,并respond()通过对该实例的java反射进行调用。

如果您有类似的实例字段

@Controller
public class MyController {
    private int count = 0;
    @RequestMapping(value = "/index")
    public String respond() {
        count++;
        return "index";
    }
}

count 这将是一种危险,因为它可能会被许多线程修改,并且对其所做的更改可能会丢失。

您需要了解Servlet容器的工作方式。该容器实例化了Spring
MVC的一个实例DispatcherServlet。容器还管理线程池,用于响应连接,即。HTTP请求。当这样的请求到达时,容器从池中选择一个线程,并在该线程内执行上的service()方法,该方法将DispatcherServlet分派到@ControllerSpring为您注册的正确实例(根据您的配置)。

所以是的,Spring
MVC类必须是线程安全的。您可以通过为类实例字段使用不同的作用域或仅使用局部变量来实现。否则,您需要在代码中的关键部分周围添加适当的同步。



 类似资料:
  • 看起来它工作得很好,但我想知道我是否必须确保新代码需要线程安全?这里有什么意见吗?抱歉用了假名字,提前致谢。

  • 本文向大家介绍哪些集合类是线程安全的?相关面试题,主要包含被问及哪些集合类是线程安全的?时的应答技巧和注意事项,需要的朋友参考一下 Vector、Hashtable、Stack 都是线程安全的,而像 HashMap 则是非线程安全的,不过在 JDK 1.5 之后随着 Java. util. concurrent 并发包的出现,它们也有了自己对应的线程安全类,比如 HashMap 对应的线程安全类就

  • 例如,以下方法: 我关心的是如果我有多个线程调用。对象是否可能被另一个线程覆盖?换句话说,Thread 1调用并获取返回的

  • 我看到了不同的PHP二进制文件,比如非线程或线程安全? 这是什么意思? 这些软件包之间有什么区别?

  • 我在多线程环境中做的工作很少。所以,我需要知道below类的getInstance函数是否是线程安全的。这是单例类: 在getInstance函数(未注释)中,返回静态对象的引用。它需要线程安全机制吗? 在第二个getInstance(注释)中,如果singleObject为null,我们就创建对象。所以,它需要锁定机制,需要同步,对吧?

  • 问题内容: 在中,此变量被声明为是我的问题,在某些调用之后检查值还是在多线程代码中使用perror()是安全的。这是线程安全变量吗?如果没有,那还有什么选择呢? 我在x86体系结构上将Linux与gcc一起使用。 问题答案: 是的,它是线程安全的。在Linux上,全局errno变量是特定于线程的。POSIX要求errno必须是线程安全的。 参见http://www.unix.org/whitepa

  • 问题内容: 我们在项目中使用了Drools kieSessions。许多线程可以创建新的kieSession。有时在创建会话时线程可能会挂起。因此,问题是: 首先 是kieContainer.newKieSession线程安全操作吗? 上吊的原因可能是肮脏的文字或阅读的kie会话集之类的东西吗? 问题答案: 当我在实践中检查 不是线程安全的操作。

  • 问题内容: 在Java中:线程安全吗,即返回的迭代器是在任何时候反映列表的当前状态,还是仅在创建列表时反映列表的状态? 问题答案: List.iterator()的行为未定义或与其他List实现保持一致。 对于ArrayList,LinkedList,如果在迭代列表时对其进行了修改,则可以获得ConcurrentModificationException。(这不能保证)避免此问题的方法是使用syn