servlet单实例多线程
2016-04-25 14:45
225 查看
转载:http://blog.chinaunix.net/uid-7374279-id-3687149.html
首先明确:Servlet是单实例的,即对于同一种业务请求只有一个是实例。不同的业务请求可以通过分发来产生多个实例。
其次:单实例的原因我想是因为单实例足可以处理某一个请求,就像ibatis的Querydao、UpdateDao一样都是单实例的。
再次:为什么单实例足可以处理某一个请求,因为Servlet是单实例多线程的。
http://hiyachen.cublog.cn chf@tsinghua.org.cn
先看一段代码:
package hiya.test;
public class Servlet {
private static Servlet instance=new Servlet();
private Servlet(){
}
public static Servlet getInstance(){
return instance;
}
public void services(){
System.out.println("do something");
}
static class Client extends Thread{
private Servlet servlet;
public Client(Servlet servlet){
this.servlet=servlet;
}
public void run(){
servlet.services();
//System.out.println("do something");
}
}
public static void main(){
Servlet servlet=Servlet.getInstance();
for(int i=0;i<10;i++){
Client client=new Client(servlet);
client.start();
}
}
}
这是单实例多线程的实现代码。(真想把jdk源码贴出来。)
首先明确:Servlet是单实例的,即对于同一种业务请求只有一个是实例。不同的业务请求可以通过分发来产生多个实例。
其次:单实例的原因我想是因为单实例足可以处理某一个请求,就像ibatis的Querydao、UpdateDao一样都是单实例的。
再次:为什么单实例足可以处理某一个请求,因为Servlet是单实例多线程的。
http://hiyachen.cublog.cn chf@tsinghua.org.cn
先看一段代码:
package hiya.test;
public class Servlet {
private static Servlet instance=new Servlet();
private Servlet(){
}
public static Servlet getInstance(){
return instance;
}
public void services(){
System.out.println("do something");
}
static class Client extends Thread{
private Servlet servlet;
public Client(Servlet servlet){
this.servlet=servlet;
}
public void run(){
servlet.services();
//System.out.println("do something");
}
}
public static void main(){
Servlet servlet=Servlet.getInstance();
for(int i=0;i<10;i++){
Client client=new Client(servlet);
client.start();
}
}
}
这是单实例多线程的实现代码。(真想把jdk源码贴出来。)
servlet单实例多线程处理原理:
servlet中的init方法只有在启动(例如web容器启动,要看loadOnStartup的设置)的时候调用,也就是只初始化一次,这就是单实例。 servlet在处理请求的时候 调用的是service方法,这个方法可以处理多个客户端的请求。
具体访问时:
JSP 在web容器中"翻译成servlet"由容器执行,web 容器本身就是提供的多线程,A,B,C 3个访问,建立3个独立的线程组,然后运行一个servlet。依次执行。
这就解决了多用户同一实例实行的困惑。
要注意几点:
1:servlet首先不是现成线程的。
2:Servlet体系结构是建立在Java多线程机制之上的,它的生命周期是由Web容器负责的。
Servlet容器会自动使用线程池等技术来支持系统的运行 3:设定jsp:<%@ page isThreadSafe="false"%>来实现单线程。
相关文章推荐
- Linux_Centos如何设置IP地址,LINUX怎么修改IP地址
- Java 打包exe文件
- Centos7 SSH密钥登陆及密码密钥双重验证
- Android如何保证数据加载下一页确定当前listview的位置
- 寻找最小的k个数
- Windows电脑网络常见故障解决方法
- 超全面!完全没有设计基础的新手如何做好PPT配色?(附神器)
- java 正则过滤
- CXF动态客户端调用webservice实例
- ConvertRGBToNV12 问题记录
- Android-Charts,Android图形图表控件
- 安卓-监听home键
- 寻找最小的k个数
- 加密算法使用(二):使用MD5加密字符串(另:byte数组转16进制自动补零方法写法)
- 图解oracle jdeveloper+BPM入门 最简单流程
- CentOS6.7安装gcc-前需要安装其它包
- 点云三维重建--基于两视图的射影重构,仿射重构以及度量重构
- ORA-01704: 文字字符串过长
- Java并发编程 ExecutorService Future FutureTask Callbale的使用
- 尝试一下sql server2016里面的json功能