使用java线程时,必须通过同步等方式处理并发性带来的基本问题。
AFAIK Tomcat还可以与线程一起处理其工作负载。为什么在Tomcat中运行时我不必考虑使代码线程安全?
答案 0 :(得分:34)
你做必须在tomcat中使你的代码线程安全。 Tomcat将从多个线程调用您的代码(即您的servlet),如果该代码不是线程安全的,那么您将遇到问题。
Tomcat的线程与您自己创建的任何线程没有区别。
答案 1 :(得分:21)
再加上skaffman所提到的内容,在编写webapp时似乎不需要考虑多线程,因为Servlet框架/ API完全围绕实现方法(service()
,每个HTTP请求调用一次的doGet()
,doPost()
等。
因此,在一个简单的应用程序中,您可以在servlet和/或JSP中实现这些方法,或者不考虑多线程交互时会发生什么。
但是第二个你开始在servlet或服务方法之间共享状态,然后没有意识到它你处理多个线程交互,如果你不小心,你最终会有多个 - 线程或同步问题。你将不得不处理这个因为在Tomcat中(我假设所有的servlet容器,虽然我不知道它是否是Servlet规范所要求的)每个请求都由(可能)一个不同的线程处理。因此,如果您同时收到两个请求,这些请求将同时由两个独立的线程处理(同时)。
答案 2 :(得分:4)
如果您认为Tomcat使您的应用程序线程安全,请使用可变成员变量(如非并发hashmap)编写Servlet。
然后让servlet为每个请求放入hashmap中的东西。获得可爱的并发异常不会花费很长时间。
这就是为什么一般来说,对于类似单身的组件,你必须非常小心成员变量,因为它们在访问对象的多个线程之间共享。
现在,servlet容器为每个请求创建一个新的临时对象(这是某些Web应用程序框架所做的),您可以将与该临时对象中的成员变量交互的行为放在线程安全的位置。
答案 3 :(得分:1)
因为Java EE容器的编写方式使它们能够为您处理线程。您编写的代码是线程安全的,容器完成剩下的工作。它汇集线程并在每个请求进入时为它们分配一个。