首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >线程安全servlet

线程安全servlet
EN

Stack Overflow用户
提问于 2012-01-14 09:29:06
回答 2查看 3.4K关注 0票数 2

当我们创建servlet时,为什么类变量(实例和静态变量)不是线程安全的?

为什么方法doPost() doGet() 是线程安全的?

我认为每个对servlet容器的新请求都会创建servlet类的新实例(它扩展了HttpServlet)。这每个实例都拥有托管在内存中的类变量,那么必须使这些变量线程安全?。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-14 09:37:42

servlet只实例化一次:在加载时。然后,当客户端发出请求时,它就被线程化了。

这就解释了为什么你必须把监视器放在必要的地方,等等。

由于doGet和doPost依赖于请求,所以它是线程安全的:如果您计划在doGet和doPost中执行原子操作,则应该考虑创建同步方法/块。

票数 9
EN

Stack Overflow用户

发布于 2016-11-01 19:43:37

当我们创建servlet时,为什么类变量(实例和静态变量)不是线程安全的?

Servlet通常运行在多线程服务器上。因此,servlet必须处理并发请求,并且应该小心地同步对共享资源的访问。共享资源包括内存中的数据(如实例或类变量)和外部对象(如文件、数据库连接和网络连接)。由于多个线程可能会改变共享数据的状态,所以共享数据并不是线程安全的。

为什么doPost()和doGet()方法是线程安全的?

如果在这些方法中使用局部变量,则doPost()doGet()是线程安全的。如果在这些方法中更改共享变量(实例或静态变量)的状态,则doPost()doGet()不是线程安全的。

这每个实例都拥有托管在内存中的类变量,那么为什么我们必须使这些变量线程安全呢?

一个Servlet存在一个实例。像doGet()doPost()这样的请求在同一个实例上创建多个线程。只要在这些方法中使用本地变量,代码就是线程安全的。

你可以在这篇文章中找到好的信息:

servlets是如何工作的?实例化、会话、共享变量和多线程

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8861324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档