tomcat中的线程问题
看这篇文章之前,请先阅读:
how tomcat works 读书笔记 十一 StandWrapper 上 地址如下:
http://blog.csdn.net/dlf123321/article/details/41247693
在tomcat中,用户的一个请求会被一个servlet来处理。
那么当第一个人请求servletA时,它会在tomcat内部的类加载器中加载,得到一个servletA类的实例。
那个第二个人请求servletA时,又怎么办呢?是再得到一个新的实例还是怎么着?
话不多说看代码
public Servlet allocate() throws ServletException {
// If not SingleThreadedModel, return the same instance every time
if (!singleThreadModel) {
// Load and initialize our instance if necessary
if (instance == null) { // 如果instance为null 就调用loadServlet
synchronized (this) { // 返回一个新的
if (instance == null)
instance = loadServlet();
}
}
if (!singleThreadModel) { //如果已经有instance了 直接返回就ok
countAllocated++;
return (instance);
}
}
synchronized (instancePool) { //能运行到这里,说明一定是实现了singleThreadModel
while (countAllocated >= nInstances) { //会给池中不断地放置servlet
if (nInstances < maxInstances) {
instancePool.push(loadServlet());
nInstances++;
} else {
instancePool.wait();
}
}
countAllocated++;
return (Servlet) instancePool.pop(); //最后返回顶上的一个
}
所以我们能得出一个结论,如果servlet没有实现singleThreadModel,那么第一次请求它时,返回一个新的,第二次就还是它本身了。如果实现了singleThreadModel,tomcat会维持一个servlet池,每次请求,都给你一个池里的对象。
如果你看完了我文章开头推荐的博客,应该就明白了为什么SingleThreadModel会被废弃了。
那么说到底,如果没有SingelThreadModel,多线程的问题怎么办?
既然问的了这里,那我就得先问一个问题了:如果是多线程,能有什么问题?
请参考http://www.cnblogs.com/gw811/archive/2012/09/07/2674859.html
另外在上面的文章中,如果我们只使用局部变量而不用实例变量,就可以不用synchronized(this){} 这个保护。
通过上面的阅读我们知道
解决线程问题的最好方法就是避免使用servlet类的内部变量。但这是一种非语法级的保护措施,程序员还是可能会犯这个错误的。
因此最好的方法就是引入ThreadLocal模式。这个模式,我们在后面会再讲。
参考资料
http://blog.csdn.net/dlf123321/article/details/41247693
http://www.cnblogs.com/gw811/archive/2012/09/07/2674859.html
tomcat中的线程问题的更多相关文章
- Tomcat中常见线程说明
http://blog.csdn.NET/jeff_fangji/article/details/41786205 本文讲述了Tomcat的常见线程的功能.名称.线程池和配置等信息,其中源码来自于To ...
- Tomcat中的线程池StandardThreadExecutor
之所以今天讨论它,因为在motan的的NettyServer中利用它这个线程池可以作为业务线程池,它定制了一个自己的线程池.当然还是基于jdk中的ThreadExecutor中的构造方法和execut ...
- tomcat中的线程问题2
最近在看线程的有关知识,碰到一个小问题,目前还没有解决,现记录下来. 如果在我们自己写的servlet里有成员变量,因为多线程的访问就会出现一些线程问题.这点大家都知道,我们看下面的例子. publi ...
- 详解tomcat连接数和线程数
前言 在使用tomcat时,经常会遇到连接数.线程数之类的配置问题,要真正理解这些概念,必须先了解Tomcat的连接器(Connector). 在前面的文章 详解Tomcat配置文件server.xm ...
- Tomcat 连接数与线程池详解
前言 在使用tomcat时,经常会遇到连接数.线程数之类的配置问题,要真正理解这些概念,必须先了解Tomcat的连接器(Connector). 在前面的文章 详解Tomcat配置文件server.xm ...
- Tomcat中JVM内存溢出及合理配置及maxThreads如何配置(转)
来源:http://www.tot.name/html/20150530/20150530102930.htm Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个Java虚 ...
- e.Tomcat中的sendfile支持
sendfile实质是linux系统中一项优化技术,用以发送文件和网络通信时,减少用户态空间与磁盘倒换数据,而直接在内核级做数据拷贝,这项技术是linux2.4之后就有的,现在已经很普遍的用在了C的网 ...
- tomcat中server.xml配置详解
Tomcat Server的结构图如下: 该文件描述了如何启动Tomcat Server <Server> <Listener /> <GlobaNami ...
- How Tomcat works — 八、tomcat中的session管理
在使用shiro的session的时候感觉对于tomcat中session的管理还不是特别清楚,而且session管理作为tomcat中比较重要的一部分还是很有必要学习的. 目录 概述 session ...
随机推荐
- Android实现自动更新功能
Android实现自动更新功能 Android自动更新的功能可以使用第三方的SDK来实现,但是类似友盟,就不支持x86手机的自动更新,科大讯飞,弹窗是全局的,小米手机就会默认把弹窗权限关掉不允许弹出提 ...
- 插件占坑,四大组件动态注册前奏(二) 系统Service的启动流程
转载请注明出处:http://blog.csdn.net/hejjunlin/article/details/52203903 前言:为什么要了解系统Activity,Service,BroadCas ...
- 13常用sql语句
创建语句 CREATE table if not exists b(id INTEGER PRIMARY KEY AUTOINCREMENT,waijian int ,FOREIGN KEY (wai ...
- DBCP连接池TestOnBorrow的坑
生产环境连接池TestOnBorrow设置为false,导致有时获取的连接不可用.分析如下: TestOnBorrow=false时,由于不检测池里连接的可用性,于是假如连接池中的连接被数据库关闭了, ...
- linux中的网络通信指令
1.write write命令通信是一对一的通信,即两个人之间的通信,如上图. 效果图 用法:write <用户名> 2.wall wall指令可将信息发送给每位同意接收公众信息的终端机用 ...
- DAA和CMAC
数据认证算法(DAA) Data Authentication Algorithm DAA建立在DES之上,该算法比较陈旧,人们已经发现了这个算法的安全弱点,目前已经被废止. DAA采用DES运算的 ...
- DB2数据库常用命令
--创建数据库 CREATE DATABASE example AUTOMATIC STORAGE YES --自动存储 ON 'D:\' DBPATH ON'D:\' --指定数据库控制文件的存储路 ...
- Fedora 20: How to enable SSH
1. systemctl enable sshd.service 2. service sshd restart
- 使用VideoView实现简单视频播放器
转载请注明出处:http://blog.csdn.net/hejjunlin/article/details/39471397 VideoView内部封装好了Mediaplayer.Android框架 ...
- UNIX环境高级编程——信号
一.信号生命周期 从信号发送到信号处理函数的执行完毕. 对于一个完整的信号生命周期(从信号发送到相应的处理函数执行完毕)来说,可以分为三个重要的阶段,这三个阶段由四个重要事件来刻画:信号诞生:信号在进 ...