日期:2014-05-20  浏览次数:20672 次

对于单实例,多线程的一点疑惑,还望大家指点!
servlet 是单实例,在第一次请求的时候会实例化,以后 对于该servlet的请求都会用这同一个实例进行处理。 那么在并发访问的情况下,多个线程同时访问该servlet,servlet实例是如何处理的呢!既然只有一个实例,难道是对多个请求交替处理么!

还望坛友们给予指点!理解的错误之处还望海涵!



------解决方案--------------------
可以这么理解
------解决方案--------------------
解决并发:
1、实现 SingleThreadModel 接口(不推荐)

  该接口指定了系统如何处理对同一个Servlet的调用。如果一个Servlet被这个接口指定,那么在这个Servlet中的service方法将不会有两个线程被同时执行,当然也就不存在线程安全的问题。这种方法只要继承这个接口就行了

2、同步对共享数据的操作(应避免或最小化Servlet中的同步代码)

  使用synchronized 关键字能保证一次只有一个线程可以访问被保护的区段,在本论文中可以通过同步块操作来保证Servlet的线程安全。

3、避免使用实例变量

  线程安全问题还有些是由实例变量造成的,只要在Servlet里面的任何方法里面都不使用实例变量,那么该Servlet就是线程安全的

------解决方案--------------------
1.servlet不是单例的,servlet只是一个普通的类,它也有自已的构造函数,你甚至可以用new的方式new出N多个servlet的实例,但它能正常地处理web请求,就需要交给web服务器(或者叫servlet/jsp容器吧)来进行管理,比如说tomcat,tomcat通过配置文件获取映射信息,然后只会在第一次生成servlet的实例,并把它缓存起来,下次再次请求,同样是取的这个实例

2.servlet是线程不安全的,容器可能同时将多个客户端的请求发送给一个实例的service方法,service再掉doPost/doGet,处理方法3种。
------解决方案--------------------
servlet不是单例,多请求可以加同步锁来实现