Tomcat线程与Java线程

bla*_*666 16 java multithreading tomcat

使用java线程时,必须通过同步等处理并发性带来的基本问题.

AFAIK Tomcat还可以与线程一起处理其工作负载.为什么我在Tomcat中运行时不必考虑使代码线程安全?

ska*_*man 36

必须让你的代码的线程在Tomcat中是安全的.Tomcat将从多个线程调用您的代码(即您的servlet),如果该代码不是线程安全的,那么您将遇到问题.

Tomcat的线程与您自己创建的任何线程没有什么不同.

  • 完成答案:例如,当你编写一个servlet时,你不应该在servlet类中有局部变量.为什么?因为servlet类没有为每个线程实例化.Tomcat重用多个线程的实例,因此所有变量都应该在doGet或doPost方法中,因此每次调用方法时它们都会被初始化并分配到不同的内存位置. (10认同)
  • @pakore:局部变量是那些内部方法.你的意思是实例变量. (10认同)

mat*_*t b 22

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

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

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


Ada*_*ent 5

如果您认为 Tomcat 使您的应用程序线程安全,请编写一个具有可变成员变量(如非并发哈希图)的 Servlet。

然后让 servlet 为每个请求将内容放入该哈希图中。很快就会得到一个可爱的并发异常。

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

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