这个问题在我脑海里已经有好几天了。对于许多用户访问该站点的基于客户的Web应用程序,我是否需要所有后端java类都是线程安全的?例如,如果我的网络应用程序被100个客户访问,那么每个请求是否都有在jvm中分配给它们的单独的java对象集?我正在开发一个Web项目,其中没有任何类同步,我想知道多个http请求如何不共享同一个对象?
答案 0 :(得分:4)
您的典型Web应用程序包含servlet,控制器,服务和数据访问对象等对象,这些对象没有会话状态,因此可以从并发线程安全地访问。然后是由请求线程创建的持久化实体,通常不会传递给其他线程,它们的范围仅限于创建它们的线程。
有一些基础设施对象,如连接池和Hibernate会话工厂,需要设计为线程安全。但如果你使用任何合理的框架,你通常不必自己创造这些东西。
应用程序最可能的错误来源,假设您设法避免在服务或控制器之类的东西中不恰当地保持状态,可能会由于开发人员不熟悉而导致数据库操作以非预期的方式交错知道如何使用交易。这就是我要注意的。所以有三件事:
1)避免服务,控制器,daos中的会话状态,
2)使用框架(spring就是一个例子)来提供经过验证的线程安全基础架构,并且
3)了解数据库事务,隔离级别和乐观锁定,并使用它们确保不同线程访问或更改数据而不会损坏。
答案 1 :(得分:0)
取决于您的网络应用程序和正在处理的对象的用途。如果您的网络应用程序只是一个简单的工具,那么您可以将所有对象和其他数据保留在范围内,并且您不必担心线程安全。
在线计算器或猪拉丁语翻译器将成为不需要担心线程安全的工具示例。
一旦开始处理持久数据并同时访问此数据,您需要开始考虑线程安全性和可能发生的并发问题。
用户正在检查库存水平并进行购买的在线商店将是需要一些线程安全的应用程序的示例(假设数据存储在应用程序中)。你不能让一个线程(用户)尝试并检索一个项目,而另一个线程迭代它试图找到另一个。缓存比使用静态内存存储字符串的商店更好的例子。
在您的示例中,有100个用户正在访问您的应用程序,每个客户都将访问您的应用程序的单独实例。这意味着他们发布/接收的数据与他们自己与应用程序的交互是隔离的,对数据的任何更改都将保存在本地。如果您希望用户从共享源发布/获取数据,那么您需要了解如何进行线程安全并确保并发性。
更明确地回答您的问题;
如果您没有任何静态容器类型存储数据,那么不,您不必担心线程安全。这是因为线程之间没有共同的交互。
如果您有静态容器类型用于存储数据,那么您很可能需要考虑线程安全性以确保所有线程都能安全地访问数据。