`

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线程安全性问题...

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

    比较深刻地论述了Servlet线程安全性问题

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

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

    Servlet线程安全问题.docx

    Servlet是线程不安全的。Servlet体系是建立在java多线程的基础之上的,它的生命周期是由Tomcat 来维护的。当客户端第一次请求Servlet的时候,tomcat会根据web.xml配置文件实例化servlet, 当又有一个客户端访问该...

    Servlet线程安全的解决方法

    当两个或多个线程同时访问同一个Servlet时,可能会发生多个线程同时访问同一资源的情况,数据可能会变得不一致,所以就很容易造成一系列的一些安全性问题。

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

    servlet与Struts action线程安全问题分析 <br>===================================================== Servlet的线程安全问题只有在大量的并发访问时才会显现出来,并且很难发现,因此在编写Servlet程序时要...

    Java web中servlet学习笔记 核心

    Java web中servlet学习笔记 核心。servlet执行过程、servlet生命周期、继承类、创建servlet、servlet线程安全、配置信息

    培训资料_servlet

    1、Servlet基本概念 2、Servlet基本运用、配置 3、Servlet生命周期 4、Servlet线程安全 5、Model2与MVC设计模式 6、过滤器 7、分页 8、上传组件SmartUpload 9、监听器 10、配置Tomcat连接池 11、实用技术

    Servlet是线程不安全的1

    先从Servlet的工作原理说起:首先简单解释一下Servlet接收和响应客户请求的过程,首先客户发送一个请求,Servlet是调用service()方法对请求

    jsp期末概念总结

    获得Servlet上下文  方式一 通过GeneticServlet提供的getSerletContext()  方式二 通过ServletConfig提供的getSerletContext()  方式三 通过HttpSession提供的getSerletContext() ...保证Servlet线程安全

    JSP和Servlet面试题

    线程安全就是多线程操作同一个对象不会有问题,线程同步一般来保护线程安全, 所以可以在Servlet的线程里面加上同步方法或同步块。 (Synchronized)可以保证在同一时间只有一个线程访问,(使用同步块会导致性能...

    Java学习笔记-个人整理的

    {8.1}线程的常用属性与方法}{121}{section.8.1} {8.2}后台线程}{123}{section.8.2} {8.3}创建线程的两种方法}{123}{section.8.3} {8.4}Runnable}{123}{section.8.4} {8.5}Sleep阻塞与打断唤醒}{124}{section....

    servlet 模拟

    想简单模拟下servlet,看下什么是线程安全,现在发现自己写的程序问题了,果然线程不安全。

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

    主要是关于Servlet模拟网上售票问题,引发的线程安全问题的思考,感兴趣的小伙伴们可以参考一下

Global site tag (gtag.js) - Google Analytics