代码之家  ›  专栏  ›  技术社区  ›  black666

Tomcat线程与Java线程

  •  15
  • black666  · 技术社区  · 14 年前

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

    Afaik Tomcat还与线程一起处理其工作负载。为什么在Tomcat中运行时,我不必考虑让我的代码成为线程安全?

    4 回复  |  直到 14 年前
        1
  •  33
  •   skaffman    14 年前

    在Tomcat中必须保证代码线程的安全。Tomcat将从多个线程调用您的代码(即servlet),如果该代码不是线程安全的,则会出现问题。

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

        2
  •  21
  •   matt b    14 年前

    为了补充斯卡夫曼提到的内容,在编写webapp时可能不需要考虑多线程,因为servlet框架/api完全围绕实现方法进行。( service() , doGet() , doPost() 等),每个HTTP请求调用一次。

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

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

        3
  •  4
  •   Adam Gent    14 年前

    如果您认为Tomcat使您的应用程序线程安全,那么就编写一个带有可变成员变量的servlet,比如非并发散列映射。

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

    这就是为什么在一般情况下,对于类单例组件,必须非常小心地使用成员变量,因为它们在访问对象的多个线程之间共享。

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

        4
  •  1
  •   duffymo    14 年前

    因为JavaEE容器是用它们处理线程的方式编写的。编写代码是为了线程安全,容器完成其余的工作。它汇集线程,并在每个请求进入时为其分配一个线程。