当我们创建servlet时,为什么类变量(实例和静态变量)不是线程安全的?
为什么方法doPost() 和 doGet() 是线程安全的?
我认为每个对servlet容器的新请求都会创建servlet类的新实例(它扩展了HttpServlet)。这每个实例都拥有托管在内存中的类变量,那么必须使这些变量线程安全?。
发布于 2012-01-14 09:37:42
servlet只实例化一次:在加载时。然后,当客户端发出请求时,它就被线程化了。
这就解释了为什么你必须把监视器放在必要的地方,等等。
由于doGet和doPost依赖于请求,所以它是线程安全的:如果您计划在doGet和doPost中执行原子操作,则应该考虑创建同步方法/块。
发布于 2016-11-01 19:43:37
当我们创建servlet时,为什么类变量(实例和静态变量)不是线程安全的?
Servlet通常运行在多线程服务器上。因此,servlet必须处理并发请求,并且应该小心地同步对共享资源的访问。共享资源包括内存中的数据(如实例或类变量)和外部对象(如文件、数据库连接和网络连接)。由于多个线程可能会改变共享数据的状态,所以共享数据并不是线程安全的。
为什么doPost()和doGet()方法是线程安全的?
如果在这些方法中使用局部变量,则doPost()和doGet()是线程安全的。如果在这些方法中更改共享变量(实例或静态变量)的状态,则doPost()和doGet()不是线程安全的。
这每个实例都拥有托管在内存中的类变量,那么为什么我们必须使这些变量线程安全呢?
一个Servlet存在一个实例。像doGet()或doPost()这样的请求在同一个实例上创建多个线程。只要在这些方法中使用本地变量,代码就是线程安全的。
你可以在这篇文章中找到好的信息:
https://stackoverflow.com/questions/8861324
复制相似问题