Servlet是不map是线程安全的吗

Servlet不是线程安全的。
要解释为什么Servlet为什么不是线程安全的,需要了解Servlet容器(即Tomcat)使如何响应HTTP请求的。
当Tomcat接收到Client的HTTP请求时,Tomcat从线程池中取出一个线程,之后找到该请求对应的Servlet对象并进行初始化,之后调用service()方法。要注意的是每一个Servlet对象再Tomcat容器中只有一个实例对象,即是单例模式。如果多个HTTP请求请求的是同一个Servlet,那么着两个HTTP请求对应的线程将并发调用Servlet的service()方法。
上图中的Thread1和Thread2调用了同一个Servlet1,所以此时如果Servlet1中定义了实例变量或静态变量,那么可能会发生线程安全问题(因为所有的线程都可能使用这些变量)。
比如下面的Servlet中的 name 和 i变量就会引发线程安全问题。
import javax.servlet.ServletE
import javax.servlet.http.HttpS
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletR
import java.io.IOE
import java.text.SimpleDateF
import java.util.D
public class ThreadSafeServlet extends HttpServlet {
public static String name = &Hello&;
//静态变量,可能发生线程安全问题
//实例变量,可能发生线程安全问题
SimpleDateFormat format = new SimpleDateFormat(&yyyy-MM-dd hh:mm:ss&);
public void init() throws ServletException {
super.init();
System.out.println(&Servlet初始化&);
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.printf(&%s:%s[%s]\n&, Thread.currentThread().getName(), i, format.format(new Date()));
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
System.out.printf(&%s:%s[%s]\n&, Thread.currentThread().getName(), i, format.format(new Date()));
resp.getWriter().println(&&html&&body&&h1&& + i + &&/h1&&/body&&/html&&);
在Tomcat中启动这个Servlet并在浏览器发起多个HTTP访问,最后会发现变量 i 是多线程共享的。
如果需要更加深入透彻地了解Tomcat接收HTTP的细节,以及与Servlet交互的细节,可以深入看看Tomcat的架构和源码。
阅读(...) 评论()他的最新文章
他的热门文章
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)servlet是不是线程安全的问题
[问题点数:20分,结帖人wusenet041]
servlet是不是线程安全的问题
[问题点数:20分,结帖人wusenet041]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
匿名用户不能发表回复!|Servlet线程安全吗?为什么?_百度知道
Servlet线程安全吗?为什么?
我有更好的答案
安全,绝对安全,但是没有java class更安全
为您推荐:
其他类似问题
您可能关注的内容
线程安全的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。既然servlet是线程,为何普通J2EE开发为何都不考虑线程安全?
[问题点数:20分,结帖人xianjijida7217]
既然servlet是线程,为何普通J2EE开发为何都不考虑线程安全?
[问题点数:20分,结帖人xianjijida7217]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
匿名用户不能发表回复!|}

我要回帖

更多关于 string是线程安全的吗 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信