2017-02-09 205 views
1

这个问题已经在我脑海中持续了好几天。对于许多用户访问网站的基于客户的Web应用程序,我是否需要所有后端Java类都是线程安全的?例如,如果我的web应用程序被100个客户访问,请求中的每个请求是否在jvm中分配了一组java对象?我正在开发一个Web项目,其中没有任何类是同步的,我想知道多个http请求如何不共享同一个对象?web应用程序中的线程安全

+0

通常在Web应用程序中,您只想共享/全局化只读对象。至于你的类和类,你只想同步你的类,如果他们实际上在请求之间共享。在请求期间创建和放弃的对象不应该同步添加到它们。 – RayfenWindspear

+1

作为示例,在请求结束时,在请求中使用new/factory创建的任何Object超出范围的对象完全是该请求的本地对象。通常,共享的任何其他内容都是从数据库中存储/读取的,或者是只读全局数据。 – RayfenWindspear

+1

这取决于你的意思。请求之间唯一的共享对象通常是只读属性(配置设置)。每个请求都可以被看作与所有其他请求隔离开来,没有什么需要跨请求共享。 – Pali

回答

3

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

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

假设您设法避免在诸如服务或控制器之类的事情中不恰当地保持状态,可能会导致数据库操作以无意的方式交错,这是由于开发人员不知道如何使用交易。这就是我想要的。所以三样东西:

1)避免会话状态的服务,控制器,DAOS,

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

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

0

取决于您的Web应用程序的目的和正在处理的对象。如果您的Web应用程序只是一个简单的工具,那么您可以将所有对象和其他数据保留在范围内,并且您不需要担心线程安全性。

一个在线计算器或一个猪拉丁翻译器将是不需要担心线程安全的工具的例子。

一旦开始处理持久数据并且对这些数据的并发访问,您需要开始考虑线程安全以及可能发生的并发问题。

用户正在检查库存水平并进行购买的在线商店将是一个需要某些线程安全性(假设数据存储在应用程序中)的应用程序示例。你不能让一个线程(用户)尝试和检索一个项目,而另一个线程正在迭代它,试图找到另一个。与使用静态内存来存储字符串的商店相比,缓存将是一个更好的例子。

在您的示例中,100个用户正在访问您的应用程序,每个客户将访问您的应用程序的单独实例。这意味着他们发布/接收的数据被隔离到他们与应用程序的交互中,并且对数据的任何更改都将保存在本地。如果您希望用户从共享源发布/获取数据,那么您需要了解如何执行线程安全性和确保并发性。

要更明确地回答您的问题;

如果您没有任何存储数据的静态容器类型,则不需要担心线程安全。这是因为线程之间没有共同的交互。

如果你有一个用于存储数据的静态容器类型,那么很可能你需要考虑线程安全以确保所有线程都可以安全地访问数据。

+0

您正在讨论关于SQL事务隔离级别的更多信息,而不是并发性......并且这不是答案 – Pali

+0

如果您使用静态HashMap或List来存储对象,那么您需要了解线程安全性和并发性问题。 – Afterfield