【问题标题】:web app, jsp, and multithreadedWeb 应用程序、jsp 和多线程
【发布时间】:2012-06-10 11:30:30
【问题描述】:

我目前正在使用 Java EE 构建一个新的 Web 应用程序,并使用 Apache Tomcat 作为 Web 服务器。 我在工作中使用 jsps 和 servlet。

我的问题是:

我有一个非常标准的业务逻辑。没有一个是同步的,在任何给定时间只会运行我的网络应用逻辑的一个线程吗?

既然让所有功能“同步”会造成巨大的开销,有没有什么替代方法?

如果我的项目中有静态方法。这使得一个非常简单的事情,例如:

       for (int i=0;i<10000;i++ ) {
           counter++;
       }

如果该方法不是线程安全的,那么这种方法在多用户应用程序中的行为是什么?是出乎意料的行为吗?!

再次以简单的方式:

如果我的意思是构建一个多用户 Web 应用程序,我应该“同步”我项目中的所有内容吗?如果不是全部,我应该同步什么?

【问题讨论】:

    标签: multithreading jsp web-applications multi-user


    【解决方案1】:

    在任何给定时间我的网络应用程序逻辑都只会运行一个线程吗?

    不,servlet 容器将只为每个 servlet 创建一个实例,并从多个线程调用该 servlet 的 doService() 方法。默认情况下,在 Tomcat 中,您最多可以有 200 个线程同时调用您的 servlet。

    如果 servlet 是单线程的,您的应用程序将会非常缓慢,请参阅 SingleThreadModel - 已弃用是有原因的。

    使所有功能“同步”会产生巨大的开销,有什么替代方法吗?

    有 - 您的代码应该是线程安全的或更好的 - 无状态的。请注意,如果您的 servlet 没有任何状态(如可变字段 - 不寻常),则可以由多个线程安全地访问它。这几乎适用于所有对象。

    在带有for 循环的示例代码中 - 如果counter 是局部变量,则此代码是线程安全的。如果是字段,则不安全。每个线程都有一个局部变量的本地副本,而所有访问同一个对象的线程同时访问同一个字段(并且需要同步)。

    我应该同步什么?

    可变的、全局的、共享的状态。例如。在您的示例代码中,如果counter 是一个字段并且是从多个线程修改的,则必须同步递增它(考虑AtomicInteger)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多