Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 线程安全servlet_Java_Multithreading_Servlets - Fatal编程技术网

Java 线程安全servlet

Java 线程安全servlet,java,multithreading,servlets,Java,Multithreading,Servlets,当我们创建servlet时,为什么类变量(实例和静态变量)不是线程安全的 为什么方法doPost()和doGet()是线程安全的? 我认为对servlet容器的每个新请求都会创建servlet类的新实例(它扩展了HttpServlet)。每个实例都有自己的类变量,这些类变量托管在内存中,那么我们为什么必须使这些变量成为线程安全的呢?servlet只在加载时实例化一次。然后,当客户端发出请求时,它是线程化的 这就解释了为什么你必须把监视器放在需要的地方,等等 由于DOGET和DOPAST依赖于一个

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

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


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

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

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

由于DOGET和DOPAST依赖于一个请求,它是线程安全的:如果您计划在DOGET和DOPOST中进行原子操作,则应该考虑创建同步方法/块。< /P> 当我们创建servlet时,为什么类变量(实例和静态变量)不是线程安全的

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

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

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

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

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

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


通常情况下,容器不会为每个请求创建新的servlet实例。您需要知道类变量和局部变量在jvm中的位置。这些变量的作用域是什么。谢谢。i、 e.如果我的类带有非线程安全的类变量,我应该在同步块的doGet(doPost)方法中使用该变量,或者我应该将使用该变量的代码传输到同步方法中,并在doGet(doPost)中使用该方法?如果必须这样做,我将使用一个setter,它将是一个同步方法。