JSP/Servlet的多线程原理:- 1.servelet就是一个CGI,但比传统的CGI要快得过
传统CGI是多进程的,servlet是多线程的
以多线程方式执行可大大降低对系统的资源需求,提高 系统的并发量及响应时间.
- JSP/Servlet容器默认是采用单实例多线程(这是造成线程安全的主因)方式处理多个请求的:
当客户端第一次请求某一个JSP文件时(有的servlet是随容器启动就startup):
- 服务端把该JSP编译成一个CLASS文件
- 并创建一个该类的实例
- 然后创建一个线程处理CLIENT端的请求。
如果有多个客户端同时请求该JSP文件,则服务端会创建多个线程。每个客户端请求对应一个线程。
servlet 的线程安全
servlet里的实例变量,是
被所有线程共享的,所以不是线程安全的.
因为每个线程都有它自己的堆栈空间,方法内局部变量存储在这个线程堆栈空间内,
且参数传入方法是按传值volue copy的方式
所以是线程安全的
在container运行期间,被整个系统内所有用户共同使用,所以不是线程安全 的
ServletContext是可以多线程同时读/写属性的,线程是不安全的。
struts2的ServletContext采用的是TreadLocal模式,是线程安全的
- HttpServletRequest对象和HttpServletResponse对象
每一个请求,由一个工作线程来执行,都会
创建有一对新的ServletRequest对象和ServletResponse,然后传入service()方法内
所以每个ServletRequest对象对应每个线程,而不是多线程共享,是线程安全的。所以不用担心request参数和属性的线程安全性
Session对象在用户session期间存在,
只能在属于同一个SessionID的请求的线程中被访问,因此Session对象的理论上是线程安全的。
(当用户打开多个同属于一个进程的浏览器窗口(常见的弹出窗口),在这些窗口的访问属于同一个Session,会出现多次请求,需要多个工作线程来处理请求,这时就有可能的出现线程安全问题)
<wbr><br><br><span style="font-weight:bold">servlet尽量用方法内变量,就一定线程安全么?<wbr>局部变量的数据也来自request对象或session对象啊,它们线程安全么?</wbr></span><br>
servletRequest 线程是安全的<br>
因为:每个 request都会创建一个新线程,每个新线程,容器又都会创建一对servletRequest和servletResponse对象(这是servlet基本原理)<br>
所以servletRequest对象和servletResponse对象只在一个线程内被创建,存在,被访问<br><br><br><br><span style="font-weight:bold">常见的线程安全的解决办法:</span><br>
1.使用方法内局部变量<br><ul>
<li>是因为各线程有自己堆栈空间,存储局部变量</li>
<li>方法参数传入,多采用传值(volue copy)传入方法内</li>
</ul>
<br>
2.对<span style="font-weight:bold">操作共享资源</span>的语句,方法,对象,使用同步<br>
比如<span style="font-weight:bold">写入磁盘文件</span>,采用同步锁,但建议尽量用同步代码块,不要用同步方法<br><br><br>
3.使用同步的集合类<br>
使用Vector代替ArrayList<br>
使用Hashtable代替HashMap。<br><br>
4.不要在 Servlet中再创建自己的线程来完成某个功能。<br>
Servlet本身就是多线程的,在Servlet中再创建线程,将导致执行情况复杂化<br><br>
原文地址:http://blog.sina.com.cn/s/blog_6151984a0100khbf.html<br></wbr>
分享到:
相关推荐
Java_servlet多线程 Java_servlet多线程
servlet多线程
servlet与Struts action线程安全问题分析
在上一篇关于Serlvet框架和Servlet生命周期的学习中,我们已经知道了在多线程的情况下 Servlet是线程不安全的。Servlet体系是建立在java多线程的基础之上的,它的生命周期是由Tomcat 来维护的。当客户端第一次请求...
Java_servlet多线程.pdf
当两个或多个线程同时访问同一个Servlet时,可能会发生多个线程同时访问同一资源的情况,数据可能会变得不一致,所以就很容易造成一系列的一些安全性问题。
tomcat中多线程对于servlet处理的4篇资料 基于5.5.17
NULL 博文链接:https://andrewstz.iteye.com/blog/1959963
java web程序设计说明概要使用说明书
同时包含系统通用多线程模型与消息通讯、多对多关系的分布式锁、基于Servlet的HTTP框架、基于系统通用多线程模型的Websocket框架、支持行级锁的多线程锁等组件,按需选择组件,不绑架开发者。.zip,grain是一个极简的...
Servlet API 中文参考 chm,涉及Servet资料资料、API介绍,讲述Servlets概论、生命周期、解析和载入、初始化、 Servlet处理请求、多线程和映射、Servlet的卸载、Servlet映射技术、通... Servlet API 中文参考 chm,...
人工智能-项目实践-多线程-java基础进阶。包括:socket,多线程,反射,servlet,动态代理等高级知识 java基础进阶。包括:socket,多线程,反射,servlet,动态代理等高级知识
线程安全就是多线程操作同一个对象不会有问题,线程同步一般来保护线程安全, 所以可以在Servlet的线程里面加上同步方法或同步块。 (Synchronized)可以保证在同一时间只有一个线程访问,(使用同步块会导致性能...
本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。