java问题,servlet问题,servlet在什么时候被初始化?它是线程安全吗?

java问题,servlet问题,servlet在什么时候被初始化?它是线程安全吗?,第1张

一、servlet的生命周期\x0d\x0a1. servlet 有种初始化情形:\x0d\x0aa.在servlet容器启动时初始化。在web.xml 中配置1表示在容器启动时初始化。默认没有此置,表示另一种情形。\x0d\x0a b.servlet在第一次被访问时初始化。即创建唯一的servlet实例。(单例多线程下面会说)\x0d\x0a \x0d\x0a初始化包括4个步骤:\x0d\x0a 1)servlet容器价值servlet类,把它的.class文件读入内存 \x0d\x0a 2)servlet容器创建ServletConfig对象。servletConfig对象包含特定的初始化配置信息,\x0d\x0a如s ervlet初始化参数,servlet还会是servletConfig与当前应用的ServletContext对象关联。 \x0d\x0a 3)servlet容器创建servlet对象\x0d\x0a 4)容器调用servlet对象的init(servletConfig config)方法,servlet创建完成。\x0d\x0a2. 当有请求访问该servlet是,servlet容器就会创建针对于这个请求的servletRequest于servletResponse,然后\x0d\x0aservlet的service方法被调用。当容器把servlet生成的响应结果发送给客户,容器就会销毁request和response对象。\x0d\x0a3. 容器在销毁该实例前调用servlet的destroy方法(释放servlet所占用的资源,如关闭流和数据库连接),此外还会销毁与servlet对象关联的ServletConfig对象。\x0d\x0a \x0d\x0a二、 servlet的线程安全\x0d\x0a1. servlet类只创建一个实例,对于可与客户端的并发访问,它是线程不安全的。\x0d\x0a2. servlet的处理方式是,每次访问时重新起一线程执行service方法。所以要想保证servlet的线程安全,不应该在servlet中定义实例变量。\x0d\x0a3. 当然完全可以通过加锁保证线程安全,但对于成千上万的并发访问,性能下降。

servlet本身应该是多线程,比方说LoginServlet负责控制用户登录,两个用户A和B同时登录,那么会生成2个servlet,也就是在服务器里构造出两个LoginServlet的实例,A和B各自都有一个,互不干扰。你再给A用户或B用户来个多线程就乱套了,其实多线程和单线程都能解决问题,多线程在多cpu的机子上有速度上的优势,建议你把访问数据库和读取文件分成2个servlet来做,或者干脆交给服务层来完成


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/10829434.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-11
下一篇2023-05-11

发表评论

登录后才能评论

评论列表(0条)

    保存