2010-05-11 602 views
15

当使用Java线程,一个必须采取的通过同步等Tomcat的线程和Java线程

AFAIK的Tomcat也与线程工作处理其工作量来并发的基本问题护理。为什么,我不需要考虑在Tomcat中运行代码时线程安全问题?

回答

30

必须让你的代码在tomcat线程安全。 Tomcat会从多个线程调用您的代码(即您的servlet),如果该代码不是线程安全的,则会遇到问题。

Tomcat的线程与您自己创建的任何线程没有区别。

+7

填写你的答案: 例如,当你编写一个servlet时,你不应该在servlet类中有局部变量。为什么?因为servlet类没有为每个线程实例化。 Tomcat重用了多个线程的实例,所以你的所有变量都应该放在doGet或doPost方法中,所以每次调用方法时,它们都会被初始化并分配到不同的内存中。 – pakore 2010-05-11 12:11:42

+8

@pakore:局部变量是方法内部的变量。你的意思是实例变量。 – 2010-05-11 12:14:11

+1

是的,我的意思是实例变量。抱歉。感谢您的更正:)。 我现在无法编辑我的评论:( – pakore 2010-05-11 12:29:29

20

要添加到skaffman提到什么,这似乎是你不需要编写web应用程序时,考虑多线程,因为Servlet的框架/ API是面向完全围绕实现方法(service()doGet()doPost()等),每个HTTP请求调用一次。

因此,在一个简单的应用程序中,您可以在您的servlet和/或JSP或其他任何应用程序中实现这些方法,而不用考虑多线程交互时会发生什么。

但在开始第二个具有共享状态的servlet或服务的方法之间,则可能没有意识到它处理多个线程的互动,如果你不小心,你最终会拥有多线程或同步的问题。你将不得不处理这个问题,因为在Tomcat中(我假定所有的servlet容器,尽管我不知道Servlet规范是否需要它),但每个请求都可能由不同的线程处理。因此,如果您收到两个同时发出的请求,这些请求将同时由两个单独的线程处理(同时)。

1

因为Java EE容器的编写方式可以为您处理线程。你写你的代码是线程安全的,容器完成剩下的工作。它汇集线程并为它们分配一个请求。

4

如果您认为Tomcat使您的应用程序线程安全,请使用可变成员变量(如非并发hashmap)编写Servlet。

然后让servlet为每个请求放入哈希映射中的内容。获得可爱的并发异常并不需要很长时间。

这就是为什么通常对于类似单身的组件,你必须非常小心的成员变量,因为它们是在访问该对象的多个线程之间共享的。

现在servlet容器为每个请求(这是一些web应用程序框架所做的)创建一个新的瞬态对象,您可以将与该瞬变对象中的成员变量进行交互的行为置为线程安全。