`

servlet线程安全

    博客分类:
  • java
阅读更多
JSP/Servlet的多线程原理:
1.servelet就是一个CGI,但比传统的CGI要快得过
传统CGI是多进程的,servlet是多线程的
以多线程方式执行可大大降低对系统的资源需求,提高 系统的并发量及响应时间.
JSP/Servlet容器默认是采用单实例多线程(这是造成线程安全的主因)方式处理多个请求的:
当客户端第一次请求某一个JSP文件时(有的servlet是随容器启动就startup):
服务端把该JSP编译成一个CLASS文件
并创建一个该类的实例
然后创建一个线程处理CLIENT端的请求。
多请求,多线程:
如果有多个客户端同时请求该JSP文件,则服务端会创建多个线程。每个客户端请求对应一个线程。




servlet 的线程安全
servlet里的 实例变量
servlet里的实例变量,是被所有线程共享的,所以不是线程安全的.
servlet方法里的局部变量
因为每个线程都有它自己的堆栈空间,方法内局部变量存储在这个线程堆栈空间内,
且参数传入方法是按传值volue copy的方式
所以是线程安全的
Application对象
在container运行期间,被整个系统内所有用户共同使用,所以不是线程安全 的
ServletContext对象
ServletContext是可以多线程同时读/写属性的,线程是不安全的。
struts2 的ServletContext采用的是TreadLocal模式,是线程安全的
HttpServletRequest对象和HttpServletResponse对象
每一个请求,由一个工作线程来执行,都会创建有一对新的ServletRequest对象和ServletResponse,然后传入service()方法内
所以每个ServletRequest对象对应每个线程,而不是多线程共享,是线程安全的。所以不用担心request参数和属性的线程安全性
HttpSession
Session对象在用户session期间存在,只能在属于同一个SessionID的请求的线程中被访问,因此Session对象的理论上是线程安全的。
(当用户打开多个同属于一个进程的浏览器窗口(常见的弹出窗口),在这些窗口的访问属于同一个Session,会出现多次请求,需要多个工作线程来处理请求,这时就有可能的出现线程安全问题)



servlet 尽量用方法内变量,就一定线程安全么?  局部变量的数据也来自request对象或session对象啊,它们线程安全么?
servletRequest 线程是安全的
因为:每个 request 都会创建一个新线程,每个新线程,容器又都会创建一对servletRequest和servletResponse对象(这是servlet基本原理)
所以servletRequest对象和servletResponse对象只在一个线程内被创建,存在,被访问



常见的线程安全的解决办法:
1.使用方法内局部变量
是因为各线程有自己堆栈空间,存储局部变量
方法参数传入,多采用传值(volue copy)传入方法内

2.对操作共享资源的语句,方法,对象, 使用同步
比如写入磁盘文件,采用同步锁,但建议尽量用同步代码块,不要用同步方法


3.使用同步的集合类
使用Vector代替ArrayList
使用Hashtable代替HashMap。

4.不要在 Servlet中再创建自己的线程来完成某个功能。
Servlet本身就是多线程的,在Servlet中再创建线程,将导致执行情况复杂化
分享到:
评论

相关推荐

    servlet线程安全问题

    Servlet 线程安全问题 Servlet 线程安全问题是指在使用 Servlet 编程时,如果不注意多线程安全性问题,可能会导致难以发现的错误。Servlet/JSP 技术由于其多线程运行而具有很高的执行效率,但这也意味着需要非常...

    Servlet线程安全的解决方法

    ### Servlet线程安全的解决方法 在探讨Servlet线程安全的解决方案之前,我们先来了解一下为何会出现线程安全问题。当多个线程同时访问同一个Servlet时,如果这些线程同时修改了Servlet中的共享资源(例如实例变量)...

    深入研究Servlet线程安全性问题.pdf

    ### 深入研究Servlet线程安全性问题 #### 一、引言 Servlet技术作为Java Web开发中的核心组件之一,因其高效性和灵活性被广泛应用于Web应用程序的开发中。Servlet能够处理HTTP请求,并产生相应的响应。它的一个...

    深入研究Servlet线程安全性问题

    深入研究Servlet线程安全性问题,我们首先需理解Servlet在多线程环境下的行为与潜在的风险。Servlet作为一种在服务器端处理HTTP请求的技术,被设计成能够高效处理并发请求,这一特性使其在多用户环境下表现优越。...

    Servlet线程安全问题.docx

    Servlet线程安全问题详解 在Java Web开发中,Servlet是一个重要的组件,用于处理HTTP请求。然而,Servlet在多线程环境下的线程安全问题是一个不容忽视的话题。在Servlet的生命周期中,Tomcat容器会根据需求实例化...

    servlet与Struts action线程安全问题分析

    Servlet和Struts Action是两种常见的Java Web开发组件,它们在多线程环境下运行时可能存在线程安全问题。线程安全是指在多线程环境中,一个类或者方法能够正确处理多个线程的并发访问,保证数据的一致性和完整性。 ...

    servlet与Struts action线程安全问题分析(pdf)

    #### 三、Servlet线程安全问题 线程安全问题主要发生在Servlet中使用实例变量时。当多个线程并发访问同一个Servlet实例时,如果这些线程试图同时修改实例变量,就可能发生数据不一致的情况。以下通过一个具体的示例...

    Servlet线程同步计数器实验

    Servlet线程同步计数器实验是Java Web开发中一个重要的实践课题,主要涉及到Servlet容器如何处理并发请求以及如何确保在多线程环境下的数据一致性。在这个实验中,我们将深入理解Servlet生命周期、线程模型以及线程...

    Servlet是线程不安全的1

    "Servlet线程不安全" Servlet是一种线程不安全的组件,它的线程不安全性体现在多线程环境下共享一个实例变量,导致线程安全问题。下面我们将从Servlet的工作原理说起,详细解释Servlet接收和响应客户请求的过程,并...

    servlet多线程

    4. **避免在Servlet中创建额外线程**:由于Servlet本身已具备多线程特性,额外创建线程可能会引入复杂的线程安全问题,除非有特殊需求。 5. **对外部资源的线程安全操作**:在多个Servlet中对同一外部资源(如文件...

    servlet基础笔记

    六、Servlet线程安全 由于Servlet容器可能会并发调用同一个Servlet实例的service()方法,因此需要注意Servlet的线程安全问题。通常,Servlet不应持有任何实例变量,除非它们是线程安全的。对于需要共享的数据,应...

    韩顺平Servlet学习源代码

    5. **Servlet线程安全问题**: Servlet容器通常会为每个请求创建一个新的线程,因此,Servlet实例默认是线程安全的。但是,如果在Servlet中定义了成员变量,需要考虑多线程环境下可能产生的并发问题。 6. **...

    Java Web 笔记总结

    Java Web 笔记总结主要讲解了 Servlet 的概念、生命周期、创建方式、映射细节、线程安全、获取配置信息等知识点。 Servlet 概念 Servlet 是运行在 Web 服务器中的小型 Java 程序(即:服务器端的小应用程序)。...

    Servlet网上售票问题引发线程安全问题的思考

    在讨论了Servlet线程安全问题的代码实现后,让我们来总结一下Servlet线程安全问题的几个要点: 1. 线程安全问题产生的原因:在多用户环境下,多个线程同时访问和修改共享资源(如Servlet中的`ticket`变量)时,如果...

    Web-Servlet_多线程_

    避免在Servlet实例中使用非线程安全的数据结构,如ArrayList,应使用ConcurrentHashMap等线程安全的集合类。此外,使用synchronized关键字对关键代码块进行同步,防止数据竞争。 2. 线程池:过度创建线程可能导致...

Global site tag (gtag.js) - Google Analytics