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