Web 应用程序中的线程安全

hea*_*der 2 java multithreading thread-safety

这个问题困扰了我好几天。对于许多用户访问站点的基于客户的 Web 应用程序,我是否需要所有后端 java 类都是线程安全的?例如,如果我的 Web 应用程序正在被 100 个客户访问,那么每个请求是否都会在 jvm 中分配给它们的一组单独的 java 对象?我正在开发一个 Web 项目,其中没有任何类是同步的,我想知道多个 http 请求如何不共享同一个对象?

Nat*_*hes 5

您的典型 Web 应用程序具有 servlet、控制器、服务和数据访问对象等对象,它们没有会话状态,因此可以从并发线程安全地访问。然后是由请求线程创建的持久实体,通常不会传递给其他线程,它们的范围仅限于创建它们的线程。

有一些基础设施对象,如连接池和 Hibernate 会话工厂,需要设计为线程安全的。但是如果您使用任何一种合理的框架,您通常不必自己创建这些类型的东西。

假设您设法避免在诸如服务或控制器之类的东西中不恰当地保持状态,您的应用程序最可能的错误来源可能是由于不知道如何使用事务的开发人员而以非预期的方式交错数据库操作. 这就是我要注意的。所以3件事:

1) 避免服务、控制器、daos 中的会话状态,

2) 使用一个框架(spring 就是一个例子),它提供了经过验证的线程安全基础设施,并且

3) 了解数据库事务、隔离级别和乐观锁,并使用它们来确保不同线程访问或更改数据而不会损坏。