Web应用程序,jsp和多线程

时间:2012-06-10 11:30:30

标签: multithreading jsp web-applications multi-user

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

我的问题是:

我有一个非常标准的业务逻辑。它们都没有同步,我的Web应用程序逻辑的单个线程是否会在任何给定时间运行?

由于使所有功能“同步”会产生巨大的开销,有没有替代方案呢?

如果我的项目中有静态方法。这很简单,例如:

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

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

再次以简单的方式:

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

1 个答案:

答案 0 :(得分:2)

  

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

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

如果servlet是单线程的,那么你的应用程序会像地狱一样慢,请参阅SingleThreadModel - 由于某种原因而被弃用。

  

使所有功能“同步”将产生巨大的开销,是否有任何替代方案?

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

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

  

我应该同步什么?

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