我目前正在使用Apache Tomcat作为网络服务器在Java EE中构建一个新的Web应用程序。 我在工作中使用jsps和servlets。
我的问题是:
我有一个非常标准的业务逻辑。它们都没有同步,我的Web应用程序逻辑的单个线程是否会在任何给定时间运行?
由于使所有功能“同步”会产生巨大的开销,有没有替代方案呢?
如果我的项目中有静态方法。这很简单,例如:
for (int i=0;i<10000;i++ ) {
counter++;
}
如果方法不是线程安全的,那么多用户应用程序中此方法的行为是什么?是出乎意料的行为吗?!
再次以简单的方式:
如果我的意思是建立一个多用户网络应用程序,我应该“同步”我项目中的所有内容吗?如果不是全部,我应该同步什么?
答案 0 :(得分:2)
我的网络应用程序逻辑只会在任何给定时间运行吗?
不,servlet容器将只创建每个servlet的一个实例,并从多个线程调用该servlet的doService()
方法。在Tomcat中,默认情况下,最多可以有200个线程同时调用您的servlet。
如果servlet是单线程的,那么你的应用程序会像地狱一样慢,请参阅SingleThreadModel
- 由于某种原因而被弃用。
使所有功能“同步”将产生巨大的开销,是否有任何替代方案?
有 - 您的代码应该是线程安全的或更好的 - 无状态。请注意,如果您的servlet没有任何状态(如可变字段 - 异常),则可以通过多个线程安全地访问它。这几乎适用于所有对象。
在带有for
循环的示例代码中 - 如果counter
是局部变量,则此代码是线程安全的。如果它是一个领域是不安全的。每个线程都有本地变量的本地副本,而访问同一个对象的所有线程同时访问相同的字段(并且需要同步)。
我应该同步什么?
可变,全球,共享的状态。例如。在示例代码中,如果counter
是一个字段并且是从多个线程修改的,则必须同步递增它(考虑AtomicInteger
)。