看这篇文章之前,请先阅读:

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中的线程问题的更多相关文章

  1. Tomcat中常见线程说明

    http://blog.csdn.NET/jeff_fangji/article/details/41786205 本文讲述了Tomcat的常见线程的功能.名称.线程池和配置等信息,其中源码来自于To ...

  2. Tomcat中的线程池StandardThreadExecutor

    之所以今天讨论它,因为在motan的的NettyServer中利用它这个线程池可以作为业务线程池,它定制了一个自己的线程池.当然还是基于jdk中的ThreadExecutor中的构造方法和execut ...

  3. tomcat中的线程问题2

    最近在看线程的有关知识,碰到一个小问题,目前还没有解决,现记录下来. 如果在我们自己写的servlet里有成员变量,因为多线程的访问就会出现一些线程问题.这点大家都知道,我们看下面的例子. publi ...

  4. 详解tomcat连接数和线程数

    前言 在使用tomcat时,经常会遇到连接数.线程数之类的配置问题,要真正理解这些概念,必须先了解Tomcat的连接器(Connector). 在前面的文章 详解Tomcat配置文件server.xm ...

  5. Tomcat 连接数与线程池详解

    前言 在使用tomcat时,经常会遇到连接数.线程数之类的配置问题,要真正理解这些概念,必须先了解Tomcat的连接器(Connector). 在前面的文章 详解Tomcat配置文件server.xm ...

  6. Tomcat中JVM内存溢出及合理配置及maxThreads如何配置(转)

    来源:http://www.tot.name/html/20150530/20150530102930.htm Tomcat本身不能直接在计算机上运行,需要依赖于硬件基础之上的操作系统和一个Java虚 ...

  7. e.Tomcat中的sendfile支持

    sendfile实质是linux系统中一项优化技术,用以发送文件和网络通信时,减少用户态空间与磁盘倒换数据,而直接在内核级做数据拷贝,这项技术是linux2.4之后就有的,现在已经很普遍的用在了C的网 ...

  8. tomcat中server.xml配置详解

    Tomcat Server的结构图如下: 该文件描述了如何启动Tomcat Server <Server>     <Listener />     <GlobaNami ...

  9. How Tomcat works — 八、tomcat中的session管理

    在使用shiro的session的时候感觉对于tomcat中session的管理还不是特别清楚,而且session管理作为tomcat中比较重要的一部分还是很有必要学习的. 目录 概述 session ...

随机推荐

  1. Android App之间通过Intent交互

    Android 最重要的功能之一是应用能够基于它要执行的"操作"向另一个应用发送用户. 例如,如果您的应用有您要在地图上显示的公司地址,您无需在显示地图的应用中构建 Activit ...

  2. ScrollView的阻尼回弹效果实现(仿qq空间)

    玩过新浪微博,qq空间等手机客户端的童鞋,都应该清楚,在主界面向下滑动时,会有一个阻尼回弹效果,看起来挺不错,接下来我们就来实现一下这种效果,下拉后回弹刷新界面,先看效果图: 这个是编辑器里面的界面效 ...

  3. Xcode7.2如何真机调试iOS 9.3的设备

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 本猫的mac系统为10.10,Xcode版本为7.2 本猫将i ...

  4. iOS7 CookBook精彩瞬间(三)UIActivityViewController的基本使用及自定义Activity

    1.基本使用 UIActivityViewController主要用于分享内容,创建activityView的方法很简单,调用下面的方法创建: [[UIActivityViewController a ...

  5. Objc中为何某些类的属性要设置为copy而不是strong?

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请多提意见,如果觉得不错请多多支持点赞.谢谢! hopy ;) 不知道大家是否注意,我们再使用一些第三方类的时候大多数情况下对 ...

  6. Intent和PendingIntent的区别

    intent英文意思是意图,pending表示即将发生或来临的事情.  PendingIntent这个类用于处理即将发生的事情.比如在通知Notification中用于跳转页面,但不是马上跳转.  I ...

  7. linux中echo的用法

    1.echo命令我们常用的选项有两个,一个是-n,表示输出之后不换行,另外一个是-e,表示对于转义字符按相应的方式处理,如果不加-e那么对于转义字符会按普通字符处理. 2.echo输出时的转义字符 \ ...

  8. 学习Tensorflow,使用源码安装

    PC上装好Ubuntu系统,我们一步一步来讲解如何使用源码安装tensorflow?(我的Ubuntu系统是15.10) 安装cuda 根据你的系统型号选择相应的cuda版本下载 https://de ...

  9. Git工程迁移方法总结(命令行)

    Git工程迁移方法总结 Git工程迁移方法总结 Git最近准备迁移一下位置,这里采用命令行的方式,做如下操作. 1.git init  初始化git仓库,这个时候发现本地文件夹多了个.git的文件夹. ...

  10. UNIX环境高级编程——线程限制