在使用Java线程时,通过同步等方式要注意并发带来的基本问题。
据我所知,Tomcat也使用线程来处理其工作负载。为什么当我的代码在Tomcat中运行时不必考虑使其线程安全呢?
据我所知,Tomcat也使用线程来处理其工作负载。为什么当我的代码在Tomcat中运行时不必考虑使其线程安全呢?
在Tomcat中,您确实需要使您的代码线程安全。Tomcat将从多个线程调用您的代码(即您的servlet),如果该代码不是线程安全的,您将会遇到问题。
Tomcat的线程与您自己创建的任何线程没有区别。
除了skaffman提到的内容之外,当编写Web应用程序时,似乎不需要考虑多线程,因为Servlet框架/API完全是围绕实现方法(service()
, doGet()
, doPost()
等)来进行的,这些方法在每个HTTP请求中触发一次。
因此,在简单应用程序中,您可以在您的Servlet和/或JSP中实现这些方法,并且不必考虑多个线程交互的情况。
但是,一旦在Servlet或服务方法之间存在共享状态,那么如果没有意识到,您将会涉及到多个线程相互交互的问题。如果您不小心处理,最终将会出现多线程或同步问题。您必须处理这个问题,因为在Tomcat(我假设所有Servlet容器都是这样,尽管我不知道Servlet规范是否要求如此)中,每个请求都由(可能)不同的线程处理。因此,如果您收到两个同时请求,这些请求将由两个不同的线程并发处理(即同时处理)。
由于Java EE容器是以处理线程的方式编写的,因此它们会为您处理线程。您编写的代码应该是线程安全的,容器会自动完成其余部分。它会池化线程并在请求到达时为每个请求分配一个线程。