`
shixiaomu
  • 浏览: 382932 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

serverlet 多线程

    博客分类:
  • java
阅读更多
java 多线程:分两种 互斥和协作;
多线程的一个经典的例子:
一个缓冲区,一个读线程,一个写线程。协作的概念。1.等待 2.通知
等待:可以指定时间。到时间没人唤醒,自己也能醒。
通知:可以通知一个,也可以唤醒多人。
堆和方法区是线程共享的,所以才会有对象锁的概念。


在Servlet/JSP中的几种变量类型


在编写Servlet/JSP程序时,对实例变量一定要小心使用。因为实例变量是非线程安全的。在Servlet/JSP中,变量可以归为下面的几类:

1. 类变量

request,response,session,config,application,以及JSP页面内置的page, pageContext。其中除了application外,其它都是线程安全的。

2. 实例变量

实例变量是实例所有的,在堆中分配。在Servlet/JSP容器中,一般仅实例化一个Servlet/JSP实例,启动多个该实例的线程来处理请求。而实例变量是该实例所有的线程所共享,所以,实例变量不是线程安全的。

3. 局部变量

局部变量在堆栈中分配,因为每一个线程有自己的执行堆栈,所以,局部变量是线程安全的。


两种方法:

(1)在service方法中对需要进行同步的代码段加Synchronized关键字

(2)实现SingleThreadModel接口
         public  class Myservlet extends HttpServlet implements  SingleThreadModel

       这样能保证service同时只被一个线程执行



如题:servlet采用单实例多线程模式开发的
      问题一. 说明其Servlet容器如何采用单实例多线程的方式来处理请求
      问题而. 如何在开发中保证servlet是单实例多线程的方式来工作(也就是说如何开发线程安全的servelt)
   
     一. Servlet容器如何同时来处理多个请求
           先说明几个概念:
           工作者线程Work Thread:执行代码的一组线程
           调度线程Dispatcher Thread:每个线程都具有分配给它的线程优先级,线程是根据优先级调度执行的
           Servlet采用多线程来处理多个请求同时访问。servlet依赖于一个线程池来服务请求。线程池实际上是一系列的工作者线程集合。Servlet使用一个调度线程来管理工作者线程.
         当容器收到一个Servlet请求,调度线程从线程池中选出一个工作者线程,将请求传递给该工作者线程,然后由该线程来执行Servlet的 service方法。当这个线程正在执行的时候,容器收到另外一个请求,调度线程同样从线程池中选出另一个工作者线程来服务新的请求,容器并不关心这个请求是否访问的是同一个Servlet.当容器同时收到对同一个Servlet的多个请求的时候,那么这个Servlet的service()方法将在多线程中并发执行。
            Servlet容器默认采用单实例多线程的方式来处理请求,这样减少产生Servlet实例的开销,提升了对请求的响应时间,对于Tomcat可以在server.xml中通过<Connector>元素设置线程池中线程的数目。
         就实现来说:
        调度者线程类所担负的责任如其名字,该类的责任是调度线程,只需要利用自己的属性完成自己的责任。所以该类是承担了责任的,并且该类的责任又集中到唯一的单体对象中。
而其他对象又依赖于该特定对象所承担的责任,我们就需要得到该特定对象。那该类就是一个单例模式的实现了。
  
          二 如何开发线程安全的Servlet
          1,变量的线程安全:这里的变量指字段和共享数据(如表单参数值)。

  a,将 参数变量 本地化。多线程并不共享局部变量.所以我们要尽可能的在servlet中使用局部变量。
   例如:String user = "";
         user = request.getParameter("user");

  b,使用同步块Synchronized,防止可能异步调用的代码块。这意味着线程需要排队处理。
  在使用同板块的时候要尽可能的缩小同步代码的范围,不要直接在sevice方法和响应方法上使用同步,这样会严重影响性能。



2,属性的线程安全:ServletContext,HttpSession,ServletRequest对象中属性
  ServletContext:(线程是不安全的)
   ServletContext是可以多线程同时读/写属性的,线程是不安全的。要对属性的读写进行同步处理或者进行深度Clone()。
   所以在Servlet上下文中尽可能少量保存会被修改(写)的数据,可以采取其他方式在多个Servlet中共享,比方我们可以使用单例模式来处理共享数据。
  HttpSession:(线程是不安全的)
   HttpSession对象在用户会话期间存在,只能在处理属于同一个Session的请求的线程中被访问,因此Session对象的属性访问理论上是线程安全的。
   当用户打开多个同属于一个进程的浏览器窗口,在这些窗口的访问属于同一个Session,会出现多次请求,需要多个工作线程来处理请求,可能造成同时多线程读写属性。
   这时我们需要对属性的读写进行同步处理:使用同步块Synchronized和使用读/写器来解决。

  ServletRequest:(线程是安全的)
   对于每一个请求,由一个工作线程来执行,都会创建有一个新的ServletRequest对象,所以ServletRequest对象只能在一个线程中被访问。ServletRequest是线程安全的。
   注意:ServletRequest对象在service方法的范围内是有效的,不要试图在service方法结束后仍然保存请求对象的引用。

3,使用同步的集合类:
  使用Vector代替ArrayList,使用Hashtable代替HashMap。

4,不要在Servlet中创建自己的线程来完成某个功能。
  Servlet本身就是多线程的,在Servlet中再创建线程,将导致执行情况复杂化,出现多线程安全问题。

5,在多个servlet中对外部对象(比方文件)进行修改操作一定要加锁,做到互斥的访问。
 
6,javax.servlet.SingleThreadModel接口是一个标识接口,如果一个Servlet实现了这个接口,那Servlet容器将保证在一个时刻仅有一个线程可以在给定的servlet实例的service方法中执行。将其他所有请求进行排队。
服务器可以使用多个实例来处理请求,代替单个实例的请求排队带来的效益问题。服务器创建一个Servlet类的多个Servlet实例组成的实例池,对于每个请求分配Servlet实例进行响应处理,之后放回到实例池中等待下此请求。这样就造成并发访问的问题。
此时,局部变量(字段)也是安全的,但对于全局变量和共享数据是不安全的,需要进行同步处理。而对于这样多实例的情况SingleThreadModel接口并不能解决并发访问问题。

SingleThreadModel接口在servlet规范中已经被废弃了。



守护线程(Daemon)
Java有两种Thread:“守护线程Daemon”与“用户线程User”。
我们之前看到的例子都是用户,守护线程是一种“在后台提供通用性支持”的线程,它并不属于程序本体。
从字面上我们很容易将守护线程理解成是由虚拟机(virtual machine)在内部创建的,而用户线程则是自己所创建的。事实并不是这样,任何线程都可以是“守护线程Daemon”或“用户线程User”。他们在几乎每个方面都是相同的,唯一的区别是判断虚拟机何时离开:
用户线程:Java虚拟机在它所有非守护线程已经离开后自动离开。
守护线程:守护线程则是用来服务用户线程的,如果没有其他用户线程在运行,那么就没有可服务对象,也就没有理由继续下去。
setDaemon(boolean on)方法可以方便的设置线程的Daemon模式,true为Daemon模式,false为User模式。setDaemon(boolean on)方法必须在线程启动之前调用,当线程正在运行时调用会产生异常。isDaemon方法将测试该线程是否为守护线程。值得一提的是,当你在一个守护线程中产生了其他线程,那么这些新产生的线程不用设置Daemon属性,都将是守护线程,用户线程同样。
import java.io.IOException;

/**
* 守护线程在没有用户线程可服务时自动离开
* @author 五斗米
* @blog http://blog.csdn.net/mq612
*/
public class TestMain4 extends Thread {
  
    public TestMain4() {
    }
    /**
     * 线程的run方法,它将和其他线程同时运行
     */
    public void run() {
        for(int i = 1; i <= 100; i++){
            try {
                Thread.sleep(100);
            } catch (InterruptedException ex) {
                ex.printStackTrace();
            }
            System.out.println(i);
        }
    }
  
    public static void main(String [] args){
        TestMain4 test = new TestMain4();
        test.setDaemon(true);
        test.start();
        System.out.println("isDaemon = " + test.isDaemon());
        try {
            System.in.read(); // 接受输入,使程序在此停顿,一旦接收到用户输入,main线程结束,守护线程自动结束,如果test不是守护进程必须等到test运行完了以后才退出
        } catch (IOException ex) {
            ex.printStackTrace();
        }
    }

}
分享到:
评论

相关推荐

    jsp&serverlet api开发文档

    jsp&serverlet api开发文档

    Java_tomcat_和serverlet的使用

    Java_tomcat_和serverlet的使用

    java serverlet 小实例

    Java Servlet是一种Java编程技术,用于扩展Web服务器的功能。...在本小实例中,我们将深入探讨Java Servlet的基本概念、工作原理以及如何创建一个简单的Servlet。 Servlet是Java EE(企业级应用)的一部分,它不是独立...

    serverlet4Json

    serverlet Json commons-beanutils-1.7.0.jar commons-collections-3.2 .jar commons-lang-2.4.jar commons-logging.jar ezmorph-1.0.6.jar json-lib-2.2.3-jdk15.jar xmlns=...

    基于javaweb+jsp+serverlet

    JavaWeb提供了Session API来实现会话管理,将用户信息存储在服务器端,以便跨多个请求访问。 6. **请求转发与重定向** 在处理用户请求时,Servlet可能会使用RequestDispatcher的forward()方法将请求转发到其他资源...

    jsp+serverlet+oracle

    《基于JSP+Servlet+Oracle的网上订餐系统解析》 ...总的来说,"jsp+serverlet+oracle"的组合提供了一个理想的实践平台,让初学者在实践中学习,在学习中实践,从而更好地理解和掌握Web开发的核心技术。

    Ajax与Serverlet原理及应用.zip

    你可以从“Ajax与Serverlet原理及应用”这个文件开始,逐步学习这两个技术的细节,包括它们如何协同工作以创建高效的Web应用程序。 总的来说,Ajax和Servlet的结合使用能够提供高性能、高度交互的Web界面,极大地...

    serverlet相关基础题

    如果希望Servlet支持多线程安全,则可以在JSP页面中设置`isThreadSafe`属性为`true`: ```xml ``` #### 7. 请求范围对象 - **Request**:代表单个HTTP请求的范围。每个请求都有一个单独的`HttpServletRequest`...

    JSP serverlet 增删查改

    JSP serverlet 增删查改JSP serverlet 增删查改JSP serverlet 增删查改JSP serverlet 增删查改JSP serverlet 增删查改JSP serverlet 增删查改JSP serverlet 增删查改JSP serverlet 增删查改JSP serverlet 增删查改

    java serverlet 实例

    Java Servlet是一种Java编程技术,用于扩展Web服务器的功能,使得服务器能够处理HTTP协议,进而构建动态、交互式的Web应用。Servlet是Java EE(企业版)的一部分,它为开发人员提供了处理客户端请求并返回响应的能力...

    javaWeb系列 serverlet最简单登陆代码

    随着技术的进步和安全需求的提升,实际应用中的登录功能会涉及更多复杂机制,如CSRF防护、XSS过滤、session管理等。因此,这个例子只是一个起点,实际开发中还需要不断学习和实践以掌握更全面的技能。

    jsp第2集视频关于serverlet

    这是我接着上次传的jsp视频,都是来子培训班的东西; 先传2集;有人下载了我传剩下的要不也没什么用

    JSP和Serverlet之间的传值方法

    2. **通过session对象传值**:这种方式适合于需要跨多个页面或请求保持的数据。在JSP页面设置session属性后,可以通过`HttpSession`对象在Servlet中获取这些属性。 3. **通过表单提交传值**:当用户填写表单并提交时...

    JSP基于serverlet网上书店系统

    【标题】:“JSP基于Servlet网上书店系统” 【描述】:这个项目是一个综合性的Web应用程序,采用MySQL数据库作为数据存储,JavaBean作为业务逻辑组件,Servlet作为控制器,并在Tomcat 6.0服务器上运行。...

    JSP +SERVERLET+JAVABEAN

    **JSP(Java Server Pages)** 是一种动态网页技术,由Sun Microsystems开发,它允许开发者在...这个"模式JSP+Serverlet+JavaBean"的学习文件应该包含了相关的示例代码和教程,可以帮助你更好地理解和应用这些知识。

    在线考试系统jsp+serverlet

    综上所述,"在线考试系统jsp+serverlet"是一个综合运用Java Web技术构建的教育信息化平台,它通过jsp提供友好的用户界面,借助servlet处理复杂的业务逻辑,从而实现教师、学生和管理员的各类功能需求。

    javabean+mysql+serverlet 学生成绩管理系统

    【标题】"javabean+mysql+serverlet 学生成绩管理系统"是一个基于J2EE技术栈构建的应用,主要用于管理教育机构的学生成绩。在这样的系统中,JavaBean是核心组件,它作为数据封装的载体,实现了业务逻辑;MySQL是常用...

    Flex在myeclipse下如何配置以及用serverlet的交互

    这只是一个基础的框架,实际开发中还需要考虑错误处理、安全性、性能优化等多个方面。提供的文档如《如何学习flex.doc》、《MyEclipse下配置Flex.doc》、《整合Flex和Java--配置篇.pdf》和《Flex与Java Servlet交互...

    javaweb+javabean+serverlet

    javaweb期末课程设计,基于jsp+javabean+serverlet,是一个基于JSP、JavaBean和Servlet的JavaWeb应用程序。它旨在提供一个用户友好的界面,使用户能够完成投票。 技术实现: JSP:用于创建用户界面,包括展示投票...

Global site tag (gtag.js) - Google Analytics