首页 > 试题广场 >

下面有关servle中tinit,service,destr

[单选题]
下面有关servlet中init,service,destroy方法描述错误的是?
  • init()方法是servlet生命的起点。一旦加载了某个servlet,服务器将立即调用它的init()方法
  • service()方法处理客户机发出的所有请求
  • destroy()方法标志servlet生命周期的结束
  • servlet在多线程下使用了同步机制,因此,在并发编程下servlet是线程安全的
推荐
答案为D。
servlet在多线程下其本身并不是线程安全的。
如果在类中定义成员变量,而在service中根据不同的线程对该成员变量进行更改,那么在并发的时候就会引起错误。最好是在方法中,定义局部变量,而不是类变量或者对象的成员变量。由于方法中的局部变量是在栈中,彼此各自都拥有独立的运行空间而不会互相干扰,因此才做到线程安全。
编辑于 2016-07-07 22:19:11 回复(35)
init方法: 是在servlet实例创建时调用的方法,用于创建或打开任何与servlet相的资源和初始 化servlet的状态,Servlet规范保证调用init方法前不会处理任何请求 
 service方法:是servlet真正处理客户端传过来的请求的方法,由web容器调用, 根据HTTP请求方法(GET、POST等),将请求分发到doGet、doPost等方法 
destory方法:是在servlet实例被销毁时由web容器调用。Servlet规范确保在destroy方法调用之 前所有请求的处理均完成,需要覆盖destroy方法的情况:释放任何在init方法中 打开的与servlet相关的资源存储servlet的状态
发表于 2014-11-21 20:51:45 回复(7)
Servlet是线程不安全的,在Servlet类中可能会定义共享的类变量,这样在并发的多线程访问的情况下,不同的线程对成员变量的修改会引发错误。
发表于 2015-09-16 21:40:00 回复(4)
DU1头像 DU1
servlet 对象在 tomcat 服务器是单实例多线程的。 因为 servlet 是多线程的,所以当多个 servlet 的线程同时访问了 servlet 的共享数据,如成员变量,可能会引发线程安全问题。
  
解决办法:

                                     1 )把使用到共享数据的代码块进行同步(使用 synchronized 关键字进行同步)

                                     2 )建议在 servlet 类中尽量不要使用成员变量。如果确实要使用成员,必须同步。而且尽量缩小同步代码块的范围。(哪里使用到了成员变量,就同步哪里!!),以避免因为同步而导致并发效率降低。

发表于 2017-06-30 16:18:17 回复(5)
Servlet 生命周期:Servlet 加载--->实例化--->服务--->销毁。 init():在Servlet的生命周期中,仅执行一次init()方法。它是在服务器装入Servlet时执行的,负责初始化Servlet对象。可以配置服务器,以在启动服务器或客户机首次访问Servlet时装入Servlet。无论有多少客户机访问Servlet,都不会重复执行init()。 service():它是Servlet的核心,负责响应客户的请求。每当一个客户请求一个HttpServlet对象,该对象的Service()方法就要调用,而且传递给这个方法一个“请求”(ServletRequest)对象和一个“响应”(ServletResponse)对象作为参数。在HttpServlet中已存在Service()方法。默认的服务功能是调用与HTTP请求的方法相应的do功能。 destroy(): 仅执行一次,在服务器端停止且卸载Servlet时执行该方法。当Servlet对象退出生命周期时,负责释放占用的资源。一个Servlet在运行service()方法时可能会产生其他的线程,因此需要确认在调用destroy()方法时,这些线程已经终止或完成。
编辑于 2016-07-09 15:12:43 回复(0)
这道题 我不服,init明明是在实例化servlet后才会调用,不能说是一加载servlet就调用
发表于 2016-09-06 09:24:35 回复(6)
Servlet是单实例多线程的,并且没有采用同步机制,是线程不安全的。

发表于 2016-03-16 23:03:38 回复(0)
servlet里的实例变量,是被所有线程共享 的,所以不是线程安全的.
发表于 2015-11-08 20:35:23 回复(0)
选D,并没有使用同步机制。只不过无状态的servlet就是线程安全的。
发表于 2015-03-22 22:50:04 回复(3)
A应该更加严谨一点,servlet是加载进容器然后创建对象再执行init方法
发表于 2020-04-10 08:34:10 回复(0)
1.Servlet 通过调用 init () 方法进行初始化。Servlet 创建于用户第一次调用对应于该 Servlet 的 URL 时,但是也可以指定 Servlet 在服务器第一次启动时被加载。当用户调用一个 Servlet 时,就会创建一个 Servlet 实例,每一个用户请求都会产生一个新的线程.

2.Servlet 调用 service() 方法来处理客户端的请求。Service() 方法是执行实际任务的主要方法。Servlet 容器(即 Web 服务器)调用 service() 方法来处理来自客户端(浏览器)的请求,并把格式化的响应写回给客户端。每次服务器接收到一个 Servlet 请求时,服务器会产生一个新的线程并调用服务。service() 方法检查 HTTP 请求类型(GET、POST、PUT、DELETE 等),并在适当的时候调用 doGet、doPost、doPut,doDelete 等方法。

3.Servlet 通过调用 destroy() 方法终止(结束)。destroy() 方法只会被调用一次,在 Servlet 生命周期结束时被调用。destroy() 方法可以让您的 Servlet 关闭数据库连接、停止后台线程、把 Cookie 列表或点击计数器写入到磁盘,并执行其他类似的清理活动。



  • 第一个到达服务器的 HTTP 请求被委派到 Servlet 容器。
  • Servlet 容器在调用 service() 方法之前加载 Servlet。
  • 然后 Servlet 容器处理由多个线程产生的多个请求,每个线程执行一个单一的 Servlet 实例的 service() 方法。

发表于 2020-03-03 18:23:19 回复(0)
D.
Servlet的生命周期:
    1.初始化.调用init()方法创建相应的资源
    2.调用service方法对客户的请求进行相应,根据客户的请求方式来执行具体的doGet()或者doPost()方法
    3.Servlet实例销毁时调用destroy()方法

Servlet的线程并不是安全的
发表于 2015-08-13 17:12:33 回复(0)
答案为D。 servlet在多线程下其本身并不是线程安全的。 如果在类中定义成员变量,而在service中根据不同的线程对该成员变量进行更改,那么在并发的时候就会引起错误。最好是在方法中,定义局部变量,而不是类变量或者对象的成员变量。由于方法中的局部变量是在栈中,彼此各自都拥有独立的运行空间而不会互相干扰,因此才做到线程安全。 init方法: 是在servlet实例创建时调用的方法,用于创建或打开任何与servlet相的资源和初始 化servlet的状态,Servlet规范保证调用init方法前不会处理任何请求   service方法:是servlet真正处理客户端传过来的请求的方法,由web容器调用, 根据HTTP请求方法(GET、POST等),将请求分发到doGet、doPost等方法  destory方法:是在servlet实例被销毁时由web容器调用。Servlet规范确保在destroy方法调用之 前所有请求的处理均完成,需要覆盖destroy方法的情况:释放任何在init方法中 打开的与servlet相关的资源存储servlet的状态
发表于 2021-10-02 00:00:13 回复(0)
init()不是在实例化(创建)servlet的时候再调用吗?A选项我觉得不对吧。
Servlet的生命周期分为5个阶段:加载、创建、初始化、处理客户请求、卸载。

(1)加载:容器通过类加载器使用servlet类对应的文件加载servlet

(2)创建:通过调用servlet构造函数创建一个servlet对象

(3)初始化:调用init方法初始化

(4)处理客户请求:每当有一个客户请求,容器会创建一个线程来处理客户请求

(5)卸载:调用destroy方法让servlet自己释放其占用的资源

发表于 2019-08-26 10:03:33 回复(0)
init方法:是在servlet实例创建的时候调用的方法,用于创建或者打开任何与servlet相同的资源和初始化servlet的状态.servlet规范保证调用init方法前不会处理任何请求
service方法:是servlet真正处理客户端传过来的请求的方法,由web容器调用,根据http请求方法(get和post方法),将请求分发到doget和dopost方法
destroy方法:是在servlet实例被销毁的时候由web容器调用.servlet规范确保在destroy方法调用之前所欲的请求处理均完成.

Servlet是线程不安全的,在Servlet类中可能会定义共享的类变量,这样在并发的多线程访问的情况下,不同的线程对成员变量的修改会引发错误。

发表于 2018-10-29 21:53:00 回复(0)
servlet在多线程下其本身并不是线程安全的。
发表于 2021-09-05 21:02:46 回复(0)
Servlet是线程不安全的,在Servlet类中可能会定义共享的类变量,这样在并发的多线程访问的情况下,不同的线程对成员变量的修改会引发错误。所以D错误。
发表于 2021-07-25 15:25:40 回复(0)
要是线程安全还在servet上搞那么多并发编程的策略干嘛
发表于 2020-09-16 17:36:39 回复(0)
Servlet的生命周期分为5个阶段:加载、创建、初始化、处理客户请求、卸载。 (1)加载:Servlet容器(Tomcat)通过类加载器加载servlet文件(.class) (2)创建:通过调用servlet构造函数创建一个servlet对象 (3)初始化:调用init方法初始化 (4)处理客户请求:每当有一个客户请求,容器会创建一个线程来处理客户请求 (5)卸载:调用destroy方法让servlet自己释放其占用的资源 servlet是由Servlet容器负责加载Servlet类,创建Servlet对象并实例化,然后调用Servlet的init方法,进行初始化,之后调用Service方法。实例化和初始化不同。先实例化,再初始化。
发表于 2020-06-04 09:45:13 回复(0)
servlet线程不安全
发表于 2020-02-10 13:18:26 回复(0)
servlet是单线程的,  
在多线程情况下, 是非线程安全的,
servlet的service方法主要是处理请求, 包含get, post请求处理
发表于 2019-11-02 16:50:40 回复(0)